无论是服务端还是客户端,都需要对接收到的消息进行处理,在ESFramework框架中,处理消息的组件称为消息处理器,所有的消息处理器都实现了接口IDataDealer:

从 DealRequestMessage 方法的签名我们可以看到,将 NetMessage 的主体(是字节流)解析为 IContract 对象是由消息处理器自己完成的。这也是很符合实际的,消息处理器一定能解析并处理它关心的消息,而框架和应用的其它部分不必关心。这里小结一下,最开始我们把消息解析的任务从框架下放到了应用,这里,我们又把这个任务继续下放给了消息处理器。这样,各个消息处理器只用解析自己关心的消息了,在此基础上,我们就可以把消息处理器做成插件( Addin )的形式,并实现插件的动态加载功能。
现在我们来看看消息处理器插件(又称“功能插件”)

针对各种不同类型的消息(消息类型的不同体现为本条消息的 Header 中的 ServiceKey 不同),需要由不同的消息处理器来处理,管理 / 创建所有这些消息处理器的工厂,称为处理器工厂IDataDealerFactory。
前面我们已经提到了使用插件来实现消息处理器,那么 ESFramework 框架就可以提供一个基于插件的处理器工厂 FunAddinDealerFactory ,这个工厂的实现需要借助插件管理器 IAddinManagement ,关于插件管理器,可参见企业级服务器设计与实现经验之插件系统基础篇 一文。 FunAddinDealerFactory 实现如下:

FunAddinDealerFactory
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1 publicclassFunAddinDealerFactory:IDataDealerFactory
2{
3privateIAddinManagementaddinManagement;
4
5publicFunAddinDealerFactory()
6{
7}
8
9#regionproperty
10publicIAddinManagementAddinManagement
11{
12set
13{
14this.addinManagement=value;
15}
16}
17#endregion
18
19#regionIDataDealerFactory成员
20publicIDataDealerCreateDealer(intrequestType,intserverTypeKey)
21{
22foreach(IAddinaddininthis.addinManagement.AddinList)
23{
24if((addin.ServiceKey==requestType)&&(addin.Enabled))
25{
26return(IDataDealer)addin;
27}
28}
29
30returnnull;
31}
32
33#endregion
34}
上面讲述的是基于插件的处理器工厂,后面的文章中我们还会给出一个基于
Tcp
连接池的处理器工厂:)
有时,应用经常有这样的需要,对某种类型的消息或某个特定的消息进行拦截、截获,然后对其进行某种变形(如压缩、加密)等,这些功能将通过 Hook 机制实现, Hook 机制到底是如何发生作用的,请继续关注下文

1
public
interface
IDataDealer
2 {
3 NetMessageDealRequestMessage(NetMessagereqMsg);
4 }
2 {
3 NetMessageDealRequestMessage(NetMessagereqMsg);
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
{
IDataDealerCreateDealer( int requestType, int serverTypeKey); // serverTypeKey比如城市代号
}
IDataDealerFactory根据消息的类型,创建对应的处理器。
CreateDealer
方法中的第二个参数
serverTypeKey
暂时可不予关心。{
IDataDealerCreateDealer( int requestType, int serverTypeKey); // serverTypeKey比如城市代号
}
前面我们已经提到了使用插件来实现消息处理器,那么 ESFramework 框架就可以提供一个基于插件的处理器工厂 FunAddinDealerFactory ,这个工厂的实现需要借助插件管理器 IAddinManagement ,关于插件管理器,可参见企业级服务器设计与实现经验之插件系统基础篇 一文。 FunAddinDealerFactory 实现如下:

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1 publicclassFunAddinDealerFactory:IDataDealerFactory
2{
3privateIAddinManagementaddinManagement;
4
5publicFunAddinDealerFactory()
6{
7}
8
9#regionproperty
10publicIAddinManagementAddinManagement
11{
12set
13{
14this.addinManagement=value;
15}
16}
17#endregion
18
19#regionIDataDealerFactory成员
20publicIDataDealerCreateDealer(intrequestType,intserverTypeKey)
21{
22foreach(IAddinaddininthis.addinManagement.AddinList)
23{
24if((addin.ServiceKey==requestType)&&(addin.Enabled))
25{
26return(IDataDealer)addin;
27}
28}
29
30returnnull;
31}
32
33#endregion
34}
有时,应用经常有这样的需要,对某种类型的消息或某个特定的消息进行拦截、截获,然后对其进行某种变形(如压缩、加密)等,这些功能将通过 Hook 机制实现, Hook 机制到底是如何发生作用的,请继续关注下文
ESFramework介绍之(4)―消息拦截器INetMessageHook
上一篇:ESFramework介绍之(2)――网络通信消息NetMessage
转到:ESFramework 可复用的通信框架(序)
本文介绍了ESFramework框架中消息处理的机制,包括消息处理器(IDataDealer)的角色与职责,以及如何通过插件形式实现消息处理器的动态加载。此外,还讨论了基于插件的处理器工厂FunAddinDealerFactory的实现。
171

被折叠的 条评论
为什么被折叠?



