無論是服務端還是用戶端,都需要對接收到的消息進行處理,在ESFramework網絡通信架構中,處理消息的元件稱為消息處理器,所有的消息處理器都實作了接口IDataDealer:
1 public interface IDataDealer
2 {
3 NetMessage DealRequestMessage(NetMessage reqMsg) ;
4 }
從DealRequestMessage方法的簽名我們可以看到,将NetMessage的主體(是位元組流)解析為IContract對象是由消息處理器自己完成的。這也是很符合實際的,消息處理器一定能解析并處理它關心的消息,而架構和應用的其它部分不必關心。這裡小結一下,最開始我們把消息解析的任務從架構下放到了應用,這裡,我們又把這個任務繼續下放給了消息處理器。這樣,各個消息處理器隻用解析自己關心的消息了,在此基礎上,我們就可以把消息處理器做成插件(Addin)的形式,并實作插件的動态加載功能。
現在我們來看看消息處理器插件(又稱“功能插件”)
/// <summary>
/// IFunAddin 功能插件基礎接口。
/// </summary>
public interface IFunAddin :IAddin ,IDataDealer
{
}
針對各種不同類型的消息(消息類型的不同展現為本條消息的Header中的ServiceKey不同),需要由不同的消息處理器來處理,管理/建立所有這些消息處理器的工廠,稱為處理器工廠IDataDealerFactory。
public interface IDataDealerFactory
IDataDealer CreateDealer(int requestType ,int serverTypeKey) ;//serverTypeKey 比如城市代号
IDataDealerFactory根據消息的類型,建立對應的處理器。CreateDealer方法中的第二個參數serverTypeKey暫時可不予關心。
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連接配接池的處理器工廠:)
有時,應用經常有這樣的需要,對某種類型的消息或某個特定的消息進行攔截、截獲,然後對其進行某種變形(如壓縮、加密)等,這些功能将通過Hook機制實作,Hook機制到底是如何發生作用的,請繼續關注下文
<a href="http://zhuweisky.cnblogs.com/archive/2006/03/13/349055.html">ESFramework網絡通信架構介紹之(4)―消息攔截器INetMessageHook</a>
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。