2010-11-09 142 views
0

出版商暴露到其中多個用戶可以連接到斷開事件註冊和訂閱

訂戶側的事件 - 在用戶訂閱基於> publisher.OnSomeEvent + = subscriber.CallMe()

後來一些動態參數

publisher.Subscribe(參數)

publisher.Unsubscribe(參數)

根據由用戶傳遞什麼樣的參數,我想出版商來更新他們訂閱內容的用戶。

在內部我可以維護一個訂閱地圖的參數,但我的問題是,因爲事件註冊和訂閱被斷開,我無法找到一個好的方式來傳遞被調用句柄(所以我可以維護一個地圖subscriber-> arguments )呼叫訂閱/取消訂閱呼叫時。

爲了保持我的API簡單,我不希望被調用者傳遞「this」,同樣由於內聯問題,StackFrame和診斷API不能在發佈模式下工作,所以我想不出更好的設計。

感謝您的幫助,如果你能提出一個更好的方式來實現這一目標?

回答

0

這是不是最優雅的解決方案,但你可以通過它將從無需瞭解任何具體的用戶代碼中分離出版商的界面讓發佈商應對用戶。

例如

interface ISubscriber 
{ 
object Arguments{get;} 
} 

這將使客戶端API簽名:

void Subscribe(ISubscriber subscriber) 

當然,你可能要實現在一個單獨的類型的接口,如果你不想讓你的用戶類型有一個Arguments屬性。

+0

謝謝,但我的想法是讓API乾淨,我看不出太大的區別,如果我通過從你所提到的訂閱(本)。我在想解決這一問題的方法是通過給函子來訂閱的客戶 – 2010-11-09 02:59:15

+0

在預訂的客戶端也許我可以做這樣的事情publisher.GetNewInstance - 出版商然後給出了一個仿函數並在內部對發佈商方面,我可以保持一個靜態緩存並連接到返回的實例。希望我有道理 – 2010-11-09 03:00:35

0

如果你要過濾的刊物,我說溝裏的事件,而是使用類似

publisher.Subscribe(arguments, subscriber.CallMe) 

要退訂你必須有標識的一些Dort的,可能是一個GUID,字符串,整數,this(不知道爲什麼你要避免它)...