ESFramework介绍之(3)――消息处理器和处理器工厂
来源:互联网 发布:php用户注册登录系统 编辑:程序博客网 时间:2024/05/16 17:55
无论是服务端还是客户端,都需要对接收到的消息进行处理,在ESFramework框架中,处理消息的组件称为消息处理器,所有的消息处理器都实现了接口IDataDealer:
从DealRequestMessage方法的签名我们可以看到,将NetMessage的主体(是字节流)解析为IContract对象是由消息处理器自己完成的。这也是很符合实际的,消息处理器一定能解析并处理它关心的消息,而框架和应用的其它部分不必关心。这里小结一下,最开始我们把消息解析的任务从框架下放到了应用,这里,我们又把这个任务继续下放给了消息处理器。这样,各个消息处理器只用解析自己关心的消息了,在此基础上,我们就可以把消息处理器做成插件(Addin)的形式,并实现插件的动态加载功能。
现在我们来看看消息处理器插件(又称“功能插件”)
针对各种不同类型的消息(消息类型的不同体现为本条消息的Header中的ServiceKey不同),需要由不同的消息处理器来处理,管理/创建所有这些消息处理器的工厂,称为处理器工厂IDataDealerFactory。
前面我们已经提到了使用插件来实现消息处理器,那么ESFramework框架就可以提供一个基于插件的处理器工厂FunAddinDealerFactory,这个工厂的实现需要借助插件管理器IAddinManagement,关于插件管理器,可参见企业级服务器设计与实现经验之插件系统基础篇 一文。FunAddinDealerFactory实现如下:
有时,应用经常有这样的需要,对某种类型的消息或某个特定的消息进行拦截、截获,然后对其进行某种变形(如压缩、加密)等,这些功能将通过Hook机制实现,Hook机制到底是如何发生作用的,请继续关注下文
1 public interface IDataDealer
2 {
3 NetMessage DealRequestMessage(NetMessage reqMsg) ;
4 }
2 {
3 NetMessage DealRequestMessage(NetMessage reqMsg) ;
4 }
从DealRequestMessage方法的签名我们可以看到,将NetMessage的主体(是字节流)解析为IContract对象是由消息处理器自己完成的。这也是很符合实际的,消息处理器一定能解析并处理它关心的消息,而框架和应用的其它部分不必关心。这里小结一下,最开始我们把消息解析的任务从框架下放到了应用,这里,我们又把这个任务继续下放给了消息处理器。这样,各个消息处理器只用解析自己关心的消息了,在此基础上,我们就可以把消息处理器做成插件(Addin)的形式,并实现插件的动态加载功能。
现在我们来看看消息处理器插件(又称“功能插件”)
/// <summary>
/// IFunAddin 功能插件基础接口。
/// </summary>
public interface IFunAddin :IAddin ,IDataDealer
{
}
/// IFunAddin 功能插件基础接口。
/// </summary>
public interface IFunAddin :IAddin ,IDataDealer
{
}
IAddin是插件的基础接口,在企业级服务器设计与实现经验之插件系统基础篇 一文中已经作了简单介绍。
针对各种不同类型的消息(消息类型的不同体现为本条消息的Header中的ServiceKey不同),需要由不同的消息处理器来处理,管理/创建所有这些消息处理器的工厂,称为处理器工厂IDataDealerFactory。
public interface IDataDealerFactory
{
IDataDealer CreateDealer(int requestType ,int serverTypeKey) ;//serverTypeKey 比如城市代号
}
IDataDealerFactory根据消息的类型,创建对应的处理器。CreateDealer方法中的第二个参数serverTypeKey暂时可不予关心。{
IDataDealer CreateDealer(int requestType ,int serverTypeKey) ;//serverTypeKey 比如城市代号
}
前面我们已经提到了使用插件来实现消息处理器,那么ESFramework框架就可以提供一个基于插件的处理器工厂FunAddinDealerFactory,这个工厂的实现需要借助插件管理器IAddinManagement,关于插件管理器,可参见企业级服务器设计与实现经验之插件系统基础篇 一文。FunAddinDealerFactory实现如下:
FunAddinDealerFactory
1 public class FunAddinDealerFactory :IDataDealerFactory
2 {
3 private IAddinManagement addinManagement ;
4
5 public FunAddinDealerFactory()
6 {
7 }
8
9 #region property
10 public IAddinManagement AddinManagement
11 {
12 set
13 {
14 this.addinManagement = value ;
15 }
16 }
17 #endregion
18
19 #region IDataDealerFactory 成员
20 public IDataDealer CreateDealer(int requestType, int serverTypeKey)
21 {
22 foreach(IAddin addin in this.addinManagement.AddinList)
23 {
24 if((addin.ServiceKey == requestType) && (addin.Enabled))
25 {
26 return (IDataDealer)addin ;
27 }
28 }
29
30 return null;
31 }
32
33 #endregion
34 }
上面讲述的是基于插件的处理器工厂,后面的文章中我们还会给出一个基于Tcp连接池的处理器工厂:)1 public class FunAddinDealerFactory :IDataDealerFactory
2 {
3 private IAddinManagement addinManagement ;
4
5 public FunAddinDealerFactory()
6 {
7 }
8
9 #region property
10 public IAddinManagement AddinManagement
11 {
12 set
13 {
14 this.addinManagement = value ;
15 }
16 }
17 #endregion
18
19 #region IDataDealerFactory 成员
20 public IDataDealer CreateDealer(int requestType, int serverTypeKey)
21 {
22 foreach(IAddin addin in this.addinManagement.AddinList)
23 {
24 if((addin.ServiceKey == requestType) && (addin.Enabled))
25 {
26 return (IDataDealer)addin ;
27 }
28 }
29
30 return null;
31 }
32
33 #endregion
34 }
有时,应用经常有这样的需要,对某种类型的消息或某个特定的消息进行拦截、截获,然后对其进行某种变形(如压缩、加密)等,这些功能将通过Hook机制实现,Hook机制到底是如何发生作用的,请继续关注下文
ESFramework介绍之(4)―消息拦截器INetMessageHook
上一篇:ESFramework介绍之(2)――网络通信消息NetMessage
转到 :ESFramework 可复用的通信框架(序)
- ESFramework介绍之(3)――消息处理器和处理器工厂
- ESFramework介绍之(31)―― 消息分类及对应的处理器
- ESFramework介绍之(12)―― 基于Tcp连接池的消息处理器
- ESFramework介绍之(13)-- 功能插件处理器工厂
- ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy
- ESFramework介绍之(5)――消息分派器IMessageDispatcher
- ESFramework介绍之(4)――消息拦截器INetMessageHook
- ESFramework介绍之(2)――网络通信消息NetMessage
- ESFramework介绍之(1)――网络通信消息协议接口IContract
- 微信公众号开发(十二):推送消息处理器之订阅事件处理器、菜单点击处理器、二维码扫描事件处理器、位置事件处理器、取消订阅事件处理器
- ESFramework介绍之(35)―― IMessageTransceiver
- ESFramework介绍之(29)―― 插件公共设施 AddinUtil
- ESFramework介绍之(28)―― Udp组件
- ESFramework介绍之(24)―― 日志记录IEsbLogger
- ESFramework介绍之(23)―― AgileTcp
- ESFramework介绍之(20)―― 插件自动升级
- ESFramework介绍之(34)―― ITcpServerAgent和IUdpServerAgent组件关系图
- ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求
- ESFramework介绍之(8)-- 客户端插件IPassiveAddin
- mfc中句柄与指针的区别
- ESFramework介绍之(7)-- 服务器代理IServerAgent
- ESFramework介绍之(5)――消息分派器IMessageDispatcher
- ESFramework介绍之(4)――消息拦截器INetMessageHook
- ESFramework介绍之(3)――消息处理器和处理器工厂
- ESFramework介绍之(2)――网络通信消息NetMessage
- ESFramework介绍之(1)――网络通信消息协议接口IContract
- ZipHelper 修正
- iom16v.h
- AgileIM 源码公开
- 压缩与解压缩 ZipHelper
- AgileIM 即时通
- C#播放rm文件