ESFramework介绍之(5)――消息分派器IMessage

系统 2087 0

(本文原作于2006.03.14,第一次修正于2006.06.06,修正后适用于ESFramework V0.3+)

本来 Tcp/udp 组件是系统与外界交换消息的唯一进出口,而 Tcp 组件或 Udp 组件与我们系统唯一的联系是通过消息分派器IMessageDispatcher,如此一来,就相当于 ESFramework 规定了消息分派器是我们应用与外界交换消息的进出口。IMessageDispatcher是与协议无关、宿主无关的组件,即,它即可以在使用于TCP协议也可使用于Udp协议,如果使用Remoting的方式通信也可以使用IMessageDispatcher来分派消息;它即可以用在服务端也可以用于客户端,这样的高可复用性使得基于不同底层(如Tcp/Udp、服务端/客户端)构建的上层应用具有高度的统一性,同时使得ESFramework的整个架构更加清晰、学习曲线更平滑。

IMessageDispatcher保证接收到的每个消息和发送出去的每个消息都能被所有的
Hook Spy 截获。另外,消息分派器可能需要验证接收到的每个消息格式是否正确、消息是否合法、消息是否符合特定规格等。下面是消息分派器组件的组成:
ESFramework介绍之(5)――消息分派器IMessageDispatcher

消息分派器 IMessageDispatcher 定义如下:
ESFramework介绍之(5)――消息分派器IMessageDispatcher

public interface IMessageDispatcher
{
IEsbLoggerEsbLogger{
set ;}
INetMessageHookNetMessageHook{
set ;} // 可为EsbNetMessageHook
IGatewayMessageSpyGatewayMessageSpy{ set ;}
IInnerMessageSpyInnerMessageSpy{
set ;}

IContractHelperContractHelper{
set ;} // 必须设置
INakeDispatcherNakeDispatcher{ set ;} // 必须设置

NetMessageDispatchMessage(NetMessagereqMsg);

/// <summary>
/// 如所有的SingleMessage在发送之前必须经过IMessageDispatcher的Hook链和Spy
/// </summary>
NetMessageBeforeSendMessage(NetMessagemsg);

event CbNetMessageMessageReceived;
}

IMessageDispatcher的组件结构图和 接口的定义可以看出, IMessageDispatcher保证了将接受到的消息按照规定的顺序经过各个Spy、Hook、消息处理器等组件。任何消息不得例外。即使是系统内部生成的消息(如发给客户端的通知),也必须经过 IMessageDispatcher的BeforeSendMessage后才可安全的发送出去。
IMessageDispatcher的实现如下所示:

public class MessageDispatcher:IMessageDispatcher
{
#region property
#region Logger
private IEsbLoggeresbLogger = new EmptyEsbLogger();
public IEsbLoggerEsbLogger
{
set
{
if (value != null )
{
this .esbLogger = value;
}
}
}
#endregion

#region NakeDispatcher
private INakeDispatchernakeDispatcher;
public INakeDispatcherNakeDispatcher
{
set
{
this .nakeDispatcher = value;
}
}
#endregion

#region NetMessageHook
private INetMessageHooknetMessageHook = new EmptyNetMessageHook();
public INetMessageHookNetMessageHook
{
set
{
this .netMessageHook = value;
}
}
#endregion

#region InnerMessageSpy
private IInnerMessageSpyinnerMessageSpy = new EmptyInnerMessageSpy();
public IInnerMessageSpyInnerMessageSpy
{
set
{
if (value != null )
{
this .innerMessageSpy = value;
}

}
}
#endregion

#region GatewayMessageSpy
private IGatewayMessageSpygatewayMessageSpy = new EmptyGatewayNetMessageSpy();
public IGatewayMessageSpyGatewayMessageSpy
{
set
{
if (value != null )
{
this .gatewayMessageSpy = value;
}
}
}
#endregion

#region ContractHelper
private IContractHelpercontractHelper = null ;
public IContractHelperContractHelper
{
set
{
this .contractHelper = value;
}
}
#endregion

public event CbNetMessageMessageReceived;
#endregion

#region IMessageDispatcher成员

public NetMessageDispatchMessage(NetMessagereqMsg)
{
try
{
if ( this .MessageReceived != null )
{
this .MessageReceived(reqMsg);
}

this .gatewayMessageSpy.SpyReceivedMsg(reqMsg);

NetMessagemsgHooked
= this .netMessageHook.CaptureReceivedMsg(reqMsg);


this .innerMessageSpy.SpyReceivedMsg(msgHooked);
NetMessageresMsg
= this .nakeDispatcher.DispatchMessage(msgHooked);
if (reqMsg == null )
{
return null ;
}

return this .BeforeSendMessage(resMsg);
}
catch (Exceptionee)
{
this .esbLogger.Log(ee.GetType().ToString(),ee.Message, " ESFramework.Network.MessageDispatcher.DispatchMessage " ,ErrorLevel.High);
return this .contractHelper.GetResponseByServiceResultType(reqMsg,ServiceResultType.HandleFailure);
}
}

public NetMessageBeforeSendMessage(NetMessagemsg)
{
this .innerMessageSpy.SpyToBeSendedMsg(msg);
NetMessagemsgHooked
= this .netMessageHook.CaptureBeforeSendMsg(msg);
this .gatewayMessageSpy.SpyToBeSendedMsg(msgHooked);

return msgHooked;
}


#endregion
}


我们看到, IMessageDispatcher内部使用了INakeDispatcher组件,INakeDispatcher的职责比较单纯,它针对需要分派的消息调用IDataDealerFactory创建对应的处理器,然后将消息交给处理器处理后,将结果返回。其接口定义如下:

public interface INakeDispatcher
{
NetMessageDispatchMessage(NetMessagemsg);
}

INakeDispatcher的实现也非常简单:

public class NakeDispatcher:INakeDispatcher
{
#region DataDealerFactory
private IDataDealerFactorydataDealerFactory = null ;
public IDataDealerFactoryDataDealerFactory
{
set
{
this .dataDealerFactory = value;
}
}
#endregion

#region ContractHelper
private IContractHelpercontractHelper = null ;
public IContractHelperContractHelper
{
set
{
this .contractHelper = value;
}
}
#endregion

#region INakeDispatcher成员

public NetMessageDispatchMessage(NetMessagemsg)
{
IDataDealerdealer
= this .dataDealerFactory.CreateDealer(msg.Header.ServiceKey,msg.Header.TypeKey);
if (dealer == null )
{
return this .contractHelper.GetResponseByServiceResultType(msg,ServiceResultType.ServiceIsNotExist);
}

return dealer.DealRequestMessage(msg);
}

#endregion
}

通常,在客户端使用IMessageDispatcher组件时,我们不需要使用GatewayMessageSpy和InnerMessageSpy,如果是这样,那么我们只要不为MessageDispatcher的 GatewayMessageSpy属性和InnerMessageSpy属性注入对象就可以了。

上一篇: ESFramework介绍之(4)――消息拦截器INetMessageHook

转到: ESFramework 可复用的通信框架(序)

ESFramework介绍之(5)――消息分派器IMessageDispatcher


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论