设计之初是一个模块作为一个单独的进程运行,模块中有个实体列表,模块与实体(Entity)是一对多的关系,每个模块中至多可包含32个实体。
现在我们通常实现为一个模块对应一个实体,渐渐地就将模块称为实体了。
实体需要继承 CEntityBase
并实现OnNewSession
接口,该函数返回一个会话对象,在对方第一个连接过来时会调用该函数返回一个实际的会话对象。前提是IsService()
必须返回 true
启动前
void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
{
/**/
pTransactionContext->SendAnswer(Error_Succeed);
}
启动后
void OnSarted()
在框架实现中,Init
接口内部会调用OnInit
接口
ErrorCodeEnum FSMBase::Init(CEntityBase *pEntity)
{
//...
ErrorCodeEnum Error = OnInit();
//...
}
所以在实体中初始化状态机对象时,不要直接调用OnInit
接口,而是通过调用Init
接口间接触发
SP_BEGIN_ENTITY_MAP()
SP_ENTITY(C{EntityName}Entity)
...
SP_END_ENTITY_MAP()
该操作会声明一个继承ModuleBase
的子类并定义一个全局变量,并将实体注册到实体列表中,在当前类库被sphost加载时会自行对实体列表中的实体逐一进行初始化。