2013-05-28 11 views
0

我目前正在設計問題掙扎,我在尋找一些建議:) 想象我有INotificationHandler對象的集合和接口定義如下:代碼設計。組播代表進行救援?

public interface INotificationHandler 
{ 
    void Notify(string message); 
} 

現在我想打電話給通知(...)每個INotificationHandler實例。我想過使用多播委託。不過最近才我碰到一段代碼跌跌撞撞哪里哪里使用一個類似的任務(我想)表達式樹 ...不幸的是我不記得在那裏我看到了一段代碼:(

我的主要關注是因爲這種類型的方法調用會相當頻繁地發生性能。 由於這種運行在Web應用程序上下文,我能確保每一個實例的方法被調用?

的最終目標是擁有一個單一的「包裝器「類來調用某個接口類型的所有其他實例。我考慮過將這一在登錄以及...

ILogger dispatcher.Trace(...) // does nothing itself, only calls other existing ILogger instances. 
    --> calls NLogLogger(:ILogger).Trace(...) 
    --> calls SomeOtherLogger(:ILogger).Trace(...) 
    --> calls SomeOtherLogger2(:ILogger).Trace(...) 
    --> calls SomeOtherLogger3(:ILogger).Trace(...) 

我的動機做這樣的事情是實現一個NullObject模式,我可以肯定的是我的ILogger任何呼叫(這將永遠是我的委託調度員類)將成功。其次,活ILogger實例的數量將根據應用程序配置而變化。

任何反饋是非常讚賞:) Btw ..有什麼已知的模式呢?想不到一個...

+0

你看過被動擴展嗎? http://msdn.microsoft.com/ru-ru/data/gg577609.aspx –

+0

如果您只想爲日誌記錄而考慮,請考慮改爲使用現有配置系統進行日誌記錄 - 大多數日誌記錄庫已允許多個偵聽器進行封裝它與另一層界面很有趣,但感覺很浪費。否則,你應該能夠隨時產生IL(或委託/表達式)來調用你正在封裝的每個接口方法。 –

+0

以.NET INotifyCollectionChanged接口爲例。注意它的CollectionChanged成員是一個* event *,而不是一個方法。 –

回答

0

你可能想看看Mediator設計模式。

您可以爲一個給定的消息註冊callback

Mediator.Instance.Register(callback, message); 

然後當你通知給消息的所有已註冊的回調被稱爲:

Mediator.Instance.NotifyColleagues(message, parameters); 

這裏是一個example使用Action<object>代表,但更推薦使用WeakReference而不是delegates來確保垃圾收集。