黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

系統 2492 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條評論