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