entity_dev.md 1.5 KB

实体开发

设计之初是一个模块作为一个单独的进程运行,模块中有个实体列表,模块与实体(Entity)是一对多的关系,每个模块中至多可包含32个实体。

现在我们通常实现为一个模块对应一个实体,渐渐地就将模块称为实体了。

实体需要继承 CEntityBase并实现OnNewSession接口,该函数返回一个会话对象,在对方第一个连接过来时会调用该函数返回一个实际的会话对象。前提是IsService()必须返回 true

接口执行流程

实体

  1. 启动前

    void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
    {
    /**/
    pTransactionContext->SendAnswer(Error_Succeed);
    }
    
  2. 启动后

    void OnSarted()
    

状态机

  1. 初始化

在框架实现中,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加载时会自行对实体列表中的实体逐一进行初始化。