建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳門賭場網站:《WCF技術內幕》翻譯36:第2部分第6章通道:創建自定義通道和本章小結

?

創建自定義通道

上一節已經看過了通道層里的基礎類型,現在我們就來創建一個自定義通道。這個通道的目的便是要在節制臺窗口里打印一個文本。是以,我們構建的通道對付演示通道的生命周期和法度榜樣調用不合的通道成員的時刻都邑異常有用。由于我們的自定義通道會在節制臺窗口打印文本,以是有需要通報通道措施的委托調用給客棧里的下一個通道。我們會把這個通道成為委托通道(DelegatorChannel)。在開始之前,有需要指出的是,這里還看不到一個通道運行必須的整個代碼,直到第8章“綁定”會整個給出。沒法子,創建通道還必要額外的事情。

創建自定義通道重要斟酌的問題便是外形或者是通道要支持的外形。DelegatorChannel必須支持所有的通道外形(IInputChannel、 IOutputChannel、IDuplexChannel、IReplyChannel、IRequestChannel以及所有的會話變量)。是以,我們必須構建多個通道,而且這些通道有固定的層次關系。

創建基類型

由于所有的通道都要應用通道狀態機,并且每個通道必須保留客棧里下一個通道實例的引用,是以把這些屬性的聲明放在一個基類里對照合理。所有的通道類型都邑承襲自這個基類型,以是把基類型定義為泛型加倍相宜。斟酌到這些需求,我把基類型命名為DelegatorChannelBase,TShape 必須是一個引用類型,而且承襲自IChannel。(記著所有的通道類型都承襲自 IChannel。)DelegatorChannelBase的是ChannelBase的子類型,由于這樣它就會應用公共的狀態機,并且可以實現Binding 的超時屬性。DelegatorChannelBase的初始定義如下:

internal class DelegatorChannelBase : ChannelBase

where TShape : class, IChannel {

// implementation not shown yet

}

添加構造函數

DelegatorChannelBase工具不能放在客棧的底部。換句話說,DelegatorChannelBase工具必須擁有一個通道工具的引用,而且泛型類型表示的是通道外形,我們會把泛型類型作為構造函數的參數。當然構造函數還必要一個通道工廠的引用。當然,一個緣故原由便是為了便于實現綁定的(time-out)超時屬性。別的一個緣故原由便是為了在創建通道完畢的時刻可以看護一下通道工廠。你會在第7章里看到更多內容。基類的構造函數定義如下:

internal class DelegatorChannelBase : ChannelBase

where TShape : class, IChannel {

private TShape _innerChannel; // reference the next channel in the stack

private String _source; // part of the String to print to the console

protected DelegatorChannelBase(ChannelManagerBase channelManagerBase,

TShape innerChannel,

String source) : base(channelManagerBase){

if(innerChannel == null) {

throw new ArgumentNullException("DelegatorChannelBase requires a non-null channel.",

"innerChannel");

}

// set part of the String to print to console

_source = String.Format("{0} CHANNEL STATE CHANGE: DelegatorChannelBase", source);

// set the reference to the next channel

_innerChannel = innerChannel;

}

// other implementation not shown yet

}

留意_innerChannel和_source成員變量。像注釋說的,這些成員變量是為了存儲下一個通道的引用和要打印的字符。構造函數的第一個參數是ChannelManagerBase類型。ChannelManagerBase的引用經由過程ChannelBase構造函數存儲起來。

添加狀態機

由于DelegatorChannelBase承襲自抽象類型ChannelBase,并且ChannelBase承襲自抽象類型CommunicationObject但沒有實現CommunicationObject里定義的成員,是以 DelegatorChannelBase類型必須實現這些抽象成員。是以 DelegatorChannelBase里的所有狀態轉換必須傳播到客棧里的其它通道,我們的狀態轉換措施委托會調用 innerChannel通道變量,如下所示:

internal class DelegatorChannelBase : ChannelBase

where TShape : class, IChannel {

private TShape _innerChannel; // reference to the next channel

private String _source; // p新蒲京澳門賭場網站art of the String to output

// provide the _innerChannel to derived types

protected TShape InnerChannel {

get { return _innerChannel; }

}

protected DelegatorChannelBase(ChannelManagerBase channe新蒲京澳門賭場網站lManagerBase,

TShape innerChannel,

String source) : base(channelManagerBase){

if(innerChannel == null) {

throw new ArgumentNullException("DelegatorChannelBase requires a non-null channel.",

"innerChannel");

}

// set part of the String to print to console

_source = String.Format("{0} CHANNEL STATE CHANGE: DelegatorChannelBase", source);

// set the reference to the next channel

_innerChannel = innerChannel;

}

// IChannel implementation

public override T GetProperty() {

return this._innerChannel.GetProperty();

}

#region CommunicationObject members

protected override void OnAbort() {

PrintHelper.Print(_source, "OnAbort");

this._innerChannel.Abort();

}

protected override IAsyncResult OnBeginClose(TimeSpan timeout,

AsyncCallback callback,

Object state) {

// output that the method was called

PrintHelper.Print( _source, "OnBeginClose");

// delegate the call to the next channel

return this._innerChannel.BeginClose(timeout, callback, state);

}

protected override IAsyncResult OnBeginOpen(TimeSpan timeout,

AsyncCallback callback,

Object state) {

// output that the method was called

PrintHelper.Print(_source, "OnBeginOpen");

// delegate the call to the next channel

return this._innerChannel.BeginOpen(timeout, callback, state);

}新蒲京澳門賭場網站

protected override void OnClose(TimeSpan timeout) {

// output that the method was called

PrintHelper.Print(_source, "OnClose");

// delegate the call to the next channel

this._innerChannel.Close(timeout);

}

protected override void OnEndClose(IAsyncResult result) {

// output that the method was called

PrintHelper.Print(_source, "OnEndClose");

// delegate the call to the next channel

this._innerChannel.EndClose(result);

}

protected override void OnEndOpen(IAsyncResult result) {

// output that the method was called

PrintHelper.Print(_source, "OnEndOpen");

// delegate the call to the next channel

this._innerChannel.EndOpen(result);

}

protected override void OnOpen(TimeSpan timeout) {

// output that the method was called

PrintHelper新蒲京澳門賭場網站.Print(_source, "OnOpen");

// delegate the call to the next channel

this._innerChannel.Open(timeout);

}

#endregion

}

每個狀態轉換措施(OnAbort、OnBeginClose、OnBeginOpen、OnClose、OnEndClose、OnEndOpen和OnOpen)都邑調用通道上對應的狀態轉換措施。每個狀態轉換措施也可以調用PrintHelper類型上的靜態措施Print。PrintHelper類型只做在節制臺窗口上打印字符的事情。

創建數據報通道

既然我們已經定義了通道的基類型,現在就定義數據報消息互換模式的通道吧。由于數據報發送通道必須承襲IInputChannel接口,接管通道必須承襲IOutputChannel接口,以是我們必要DelegatorChannelBase來承襲這2個接口并實現他們。由于數據報接口被用作雙工通信的接口,同時也會做會雙工會話通道接口,以是我們把數據報通道定義為泛型。

注釋:我新蒲京澳門賭場網站們會從接管者開始,然后定義發送者。為了簡明扼要,我就不把所有的代碼都貼出來,而是著重展示代碼里的實現模式。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
大富婆首页 百人牛牛是那个斗地主 捕鱼王者 福彩华东15选5走势图 新疆十一选五和值跨度 福彩七乐彩开奖结果 中国足彩网比分直播新浪 3d组六偶偶奇偶奇奇 心水论坛599 天津快乐十分