(本文原作于2006.03.14,第一次修正于2006.06.06,修正后適用于ESFramework V0.3+)
本來
Tcp/udp
組件是系統(tǒng)與外界交換消息的唯一進(jìn)出口,而
Tcp
組件或
Udp
組件與我們系統(tǒng)唯一的聯(lián)系是通過消息分派器IMessageDispatcher,如此一來,就相當(dāng)于
ESFramework
規(guī)定了消息分派器是我們應(yīng)用與外界交換消息的進(jìn)出口。IMessageDispatcher是與協(xié)議無關(guān)、宿主無關(guān)的組件,即,它即可以在使用于TCP協(xié)議也可使用于Udp協(xié)議,如果使用Remoting的方式通信也可以使用IMessageDispatcher來分派消息;它即可以用在服務(wù)端也可以用于客戶端,這樣的高可復(fù)用性使得基于不同底層(如Tcp/Udp、服務(wù)端/客戶端)構(gòu)建的上層應(yīng)用具有高度的統(tǒng)一性,同時(shí)使得ESFramework的整個(gè)架構(gòu)更加清晰、學(xué)習(xí)曲線更平滑。
IMessageDispatcher保證接收到的每個(gè)消息和發(fā)送出去的每個(gè)消息都能被所有的
Hook
和
Spy
所
截獲。另外,消息分派器可能需要驗(yàn)證接收到的每個(gè)消息格式是否正確、消息是否合法、消息是否符合特定規(guī)格等。下面是消息分派器組件的組成:
消息分派器
IMessageDispatcher
定義如下:
{
IEsbLoggerEsbLogger{ set ;}
INetMessageHookNetMessageHook{ set ;} // 可為EsbNetMessageHook
IGatewayMessageSpyGatewayMessageSpy{ set ;}
IInnerMessageSpyInnerMessageSpy{ set ;}
IContractHelperContractHelper{ set ;} // 必須設(shè)置
INakeDispatcherNakeDispatcher{ set ;} // 必須設(shè)置
NetMessageDispatchMessage(NetMessagereqMsg);
/// <summary>
/// 如所有的SingleMessage在發(fā)送之前必須經(jīng)過IMessageDispatcher的Hook鏈和Spy
/// </summary>
NetMessageBeforeSendMessage(NetMessagemsg);
event CbNetMessageMessageReceived;
}
從
IMessageDispatcher的組件結(jié)構(gòu)圖和
接口的定義可以看出,
IMessageDispatcher保證了將接受到的消息按照規(guī)定的順序經(jīng)過各個(gè)Spy、Hook、消息處理器等組件。任何消息不得例外。即使是系統(tǒng)內(nèi)部生成的消息(如發(fā)給客戶端的通知),也必須經(jīng)過
IMessageDispatcher的BeforeSendMessage后才可安全的發(fā)送出去。
IMessageDispatcher的實(shí)現(xiàn)如下所示:
{
#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內(nèi)部使用了INakeDispatcher組件,INakeDispatcher的職責(zé)比較單純,它針對(duì)需要分派的消息調(diào)用IDataDealerFactory創(chuàng)建對(duì)應(yīng)的處理器,然后將消息交給處理器處理后,將結(jié)果返回。其接口定義如下:
{
NetMessageDispatchMessage(NetMessagemsg);
}
INakeDispatcher的實(shí)現(xiàn)也非常簡(jiǎn)單:
{
#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組件時(shí),我們不需要使用GatewayMessageSpy和InnerMessageSpy,如果是這樣,那么我們只要不為MessageDispatcher的
GatewayMessageSpy屬性和InnerMessageSpy屬性注入對(duì)象就可以了。
上一篇:
ESFramework介紹之(4)――消息攔截器INetMessageHook
轉(zhuǎn)到:
ESFramework 可復(fù)用的通信框架(序)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
