这是一篇迟到了很久的文章,要不是今天看到Mediar朋友写的“”的文章,我也许还不会想起写这篇应该很早就发表的Blog,它可以帮助ESFramework的研究者/使用者们更好的使用ESFramework。Mediar朋友的那篇文章中介绍了通过服务器转发P2PMessage,Mediar手动实现了一个自己的处理器,实际上ESFramework已经内置了P2PMessage的处理器,那就是P2PMessageDealer,P2PMessageDealer不仅可以把消息转发给连接到同一个AS上的好友,而且可以转发给连接到异地AS上的好友。不管怎样,还是要感谢Mediar为我们提供的示例! 到目前为止,ESFramework将接收自终端用户的消息分为6类,这可以通过ServiceType枚举看出来:
public enum ServiceType { Basic , // IBasicRequestDealer Function , P2PMessage , // 对于P2P消息,服务器仅仅转发,P2PMessageDealer FriendRelation , // 如好友列表、好友资料等 ,FriendRelationDealer GroupMessage , // 如多人联网游戏中的同步消息等(动态组消息) -- ActiveGroupMessageDealer CustomServiceType // 自定义服务种类 }
我先解释一下这几种类型的消息含义: (1)Basic,基本消息是类似这样的消息,比如登录、退出、check消息等。 (2)Function,功能请求消息是所有请求功能服务的消息,这样的请求消息都有对应的回复消息,比如查询、要求服务器计算而得到结果等等。ESFramework中,几乎所有的Function类型的消息都是由功能插件处理的。 (3)P2PMessage,点对点消息,是指用户发给另一用户而经过服务器中转的消息,比如即时通讯中的聊天消息等。 (4)FriendRelation,好友关系请求消息,比如请求好友列表、好友资料等,这在很多IM应用中是常见的。 (5) ,动态组请求消息。ESFramework支持运行时动态组创建、管理等。 (6)CustomServiceType ,自定义的消息类型,即你的应用中用到的除上面5种消息类型以外的消息。 (7)还要补充一种消息,跨区域(AS)请求,这种类型的消息将被本地AS转发到目标AS去处理。( ) ESFramework为每种类型的消息都提供了默认的处理器(或处理器接口),它们是: (1)对于Basic消息类型,ESFramework提供了IBasicRequestDealer接口,你的应用只要实现此接口就可处理所有的Basic消息。 (2)对于Function类型的消息,由于通常是由功能插件处理,所以ESFramework提供了FunAddinDealerFactory来处理所有的功能请求消息。 (3)P2PMessage,对于所有要转发的消息,ESFramework提供了P2PMessageDealer,P2PMessageDealer可以进行本区域转发和跨区域(AS)转发。如果需要将转发失败的消息存储以待以后重试,可以使用 。 (4)FriendRelation,对于好友关系请求,ESFramework提供了FriendRelationDealer处理器,你只需要实现该处理器使用到的其它组件接口即可。 (5)GroupMessage,对于动态组请求消息,ESFramework提供了ActiveGroupMessageDealer可以直接进行处理。 (6)CustomServiceType ,对于应用自定义的消息类型,你需要实现自己的消息处理器。 (7)对于跨区域(AS)请求,你可以根据AS之间的通信方式实现特定的处理器。如果AS之间采用.net remoting通信,则ESFramework提供了ESFramework.Architecture.FourTier.ForeignDealer来处理跨区域请求。 所有上述的消息处理器都可以装配到EsbRequestDealerFactory工厂,EsbRequestDealerFactory为每种类型的消息都预留了处理器插槽,你可以通过对应的属性进行处理器注入!图示如下: (图中黄色背景的组件都已经在ESFramework中提供了实现!BasicRequestDealer需要你实现IBasicRequestDealer接口) 如果你的应用只需要使用其中几种类型的消息,那么只需要为EsbRequestDealerFactory装配对应的消息处理器,这样不会为不使用的消息类型付出任何额外的代价。