跟 Model 层一样,所谓只做什么,就是说除了下面说的,其他东西不要在 Service 去做,这是要注意的。
Service 层是与服务器端(客户端)打交道的(如果框架是用在客户端的话,用在服务器端就反过来了),她只提供2种接口方法,一种是请求的接口方法,另一种是响应的接口方法。
以客户端为例,reqBagGet() 方法就是请求服务器端获取数据的接口,onBagGet() 方法就是服务器端数据回来后,回调的方法。除了提高这两种方法外,请不要加上任何多余的接口,如果有这样的需求的时候,证明你的逻辑出现了问题,重新审查你的应用逻辑,也请完整地阅读整个框架的文档。
所有的 service 都有一个很重要的方法叫做 sendNotification,她可以发送消息(事件),通过此方法发送出去的消息,在所有的 Controller 都可以监听并接收处理。
notify 方法是 sendNotification 方法的别名,建议使用更短的方法名。
function meta:onBagGet(param)
self:notify(bagModel.EVENT_BAG_GET, param, "get_temp_bag")
end
notify 方法有三个参数,消息名称、数据对象和消息类型。
- 消息名称统一在相应的 Model 层(如 BagService 对应 BagModel)中定义,定义消息唯一名称,消息名称请遵从 EVENT_模块名 为前缀,尽管不是强制的,但是建议使用良好的命名习惯。
- 数据对象是消息要传递的数据,可以传递任意类型的数据。
- 消息类型,可能有人会感到疑惑,消息名称不是可以区分不同的消息吗?为什么还要有消息类型?这里只是提供了一种选择,例如:游戏中有一个背包,还有一个临时背包,当你要发送更新背包的消息时,你可能需要传递是更新临时的还是永久的。当然你完全可以定义两个不同的消息名,这里只是提供了另一个选择。
接口方法只有2种,一种是请求的接口方法,另一种是响应的接口方法:
-- 请求服务器
function meta:reqBagGet(pos)
log4l.debug("Request getting bag infomation")
self.action = "bag.get"
self.param = {pos=pos}
self:request()
end
-- 服务器回调
function meta:onBagGet(param)
self:notify(roleModel.EVENT_BAG_GET, param, "get_temp_bag")
end
推荐的命名方式,请求方法以 req 加模块名为前缀,如获取背包信息的接口命名为 reqBagGet;响应的方法以 on 加模块名为前缀,如背包数据回来的接口命名为 onBagGet。
P.S. 要注意的是,框架中有写规范都不是强制性的,但是请大家尽量遵守;还有一些是推荐使用的方法,也希望大家尽量去采用。毕竟规范是死,思想才是活动,完全可以根据框架提供的方法,规范和建议,来定制自己的,能达到方便,高效和统一,才是目的。