程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Visual C#中定義和使用自己的特性(1)

Visual C#中定義和使用自己的特性(1)

編輯:關於C語言

在上一篇文章我們已經介紹到通過在配置文件中指定自定義的ChannelSinkProvider,我們可以在Pipeline中加入自己的ChannelSink,此時我們就可以加入自己的信息處理模塊,但是這裡我們所能操作的對象是已經經過格式化的消息(即數據流),我們看不到原始的消息對象,這也勢必影響了我們所能實現的擴展功能。而在上文的圖1中,我們看到除了ChannelSink可以擴展之外,我們還可以加入自定義的MessageSink,而它是位於格式器之前的,也就是說在MessageSink中我們可以直接操作尚未格式化的消息對象。此時,我們就獲得一個功能更強大的擴展點。直接操作消息對象,這意味著什麼呢?簡單來說,我們可以在這裡實現方法攔截,我們可以修改方法的參數、返回值,在調用方法前後加入自己的處理邏輯。是不是覺得聽上去很耳熟?沒錯,這就也正是AOP所要實現的一個目標。下面,在了解了整個Remoting的大背景以及ChannelSink的擴展機制後,我們將對MessageSink的擴展機制做進一步介紹。

在介紹前,我先提醒各位讀者注意以下幾點:

1. 確定你確實想深入了解Remoting的內部機制;

2. 確定你能很好的理解上一篇文章;

3. 如果說上一篇文章總結歸納的內容較多的話,在本文中出現的內容大多是筆者個人的探索,我想其他資料(包括英文資料)中都不曾介紹過這些內容,所以我不保證所有觀點的正確性,如果你覺得哪裡有誤,也歡迎你在評論中提出你的意見。

下面就讓我們開始品嘗大餐吧。

利用ChannelSinkProvider擴展MessageSink

MessageSink的擴展有兩種實現方法,讓我先從簡單的開始。在上一篇文章我們已經介紹到通過在配置文件中指定自定義的ChannelSinkProvider,我們可以在Pipeline中加入自己的ChannelSink。那麼有沒有一個類似於IClientChannelSinkProvider的IMessageSinkProvider呢?可惜答案是否定的。那麼我們能否通過IClIEntChannelSinkProvider插入一個MessageSink呢?插入之後它又能否發揮其功效呢?

首先我們先實現一個自定義的MessageSink。此時只需新建一個類,並實現IMessageSink接口中的SyncProcessMessage方法(為簡單起見我們只考慮同步調用模式),在方法中我們可以直接操作Message對象,比如我們可以向Message中加入額外的屬性,如下所示:

1: public class CustomMessageSink:IMessageSink
2: {
3: public IMessage SyncProcessMessage( IMessage msg )
4: {
5: // Add some custom data into msg.
6: ((IMethodMessage)msg).LogicalCallContext.SetData("MyName" , "idior" );
7: return m_NextSink.SyncProcessMessage( msg );
8: }
9: }
代碼 1

在上一篇文章的圖2中我們可以看到IClIEntChannelSinkProvider是通過下面這個方法創建ChannelSink。

1: public IClIEntChannelSink CreateSink(IChannelSender channel, string url,
2: object remoteChannelData) {...}
代碼 2

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved