2012-12-19 169 views
5

我有一個類ChatManager,它有一個ChatServer和一個ChatClient(WCF)類中的內部。冒泡事件訂閱

我希望我的控制器,它實例化ChatManager能夠訂閱是在ChatClientUserConnectedUserDisconnectedMessageReceived事件。

什麼是最優雅和合乎邏輯的方式來做到這一點?對於我來說,像我一樣定義事件ChatClient是愚蠢的,然後重新定義ChatManager中的事件僅僅是爲了將事件傳遞給Controller,而不必處理或瞭解ChatClientChatManager將訂閱ChatClient的事件,然後觸發ChatController將會聽的自己的事件。

我知道WPF有冒泡的事件的概念,但我不知道這是否是這種情況,因爲沒有什麼是用戶界面的一部分。

回答

2

我開始質疑是否都ChatManagerChatController既可以證明:你可以很容易地通過調用子類的實例在父(ChatManager)和訂閱事件,像這樣訂閱這些事件他們自己的存在。通常,當你發現自己創建了一個「經理」類時,它確實沒有必要,特別是如果它正在做的部分內容僅僅是中繼消息。

控制器類可以對付SRP,因爲它們的「責任」非常廣泛。如果您想要爲某些行爲委派責任,請將ChatClient與控制器分開,並使用ChatClient(通過合同界面)初始化從屬控制器,以便它可以根據需要與客戶端進行交互。只要確保在開始註冊事件時,在丟棄下屬或客戶端之前取消註冊這些事件,否則您將查看託管內存泄漏。

+0

史蒂夫,我想你可能是正確的兩個人的存在的理由。最初,我擁有管理員類中的所有服務器代碼和所有客戶端代碼。然後,我最近將它重新整理到兩個單獨的類中,而管理器僅僅是通過實例化服務器和客戶端來啓動服務器和連接服務器的一種手段。 我認爲這是現在擺脫'ChatManager'並讓控制器完成所有這些工作的最好方法。雖然我懷疑它是否會使控制器太臃腫。但是,我想這在邏輯上屬於它的責任。 – Cowman

+0

+1同意。任何時候發生這種情況,都可以質疑。 – nycynik

0

除非您需要事件纔有條件地達到訂閱它的事情(或由多個處理程序按順序處理),否則「冒泡」實際上不是您應該需要的。使用event aggregator可能是最好的選擇。

+0

那麼,我正在使用Prism,它有一個事件聚合器。在模型中爲事件聚合創建依賴關係是否有意義?現在我的ChatManager對Prism一無所知。 – Cowman

+0

@Cowman這取決於我會考慮的幾個因素。 1)是否曾經有過一個地方,其中包含ChatManager的庫可以在不使用Prism的情況下使用2)是否有一種方法可以使依賴性變弱(即僅使用ChatManager中的事件聚合器的接口,並且具有滿足其依賴性的一些接口) – mlorbetske

1

這不是你正在尋找的冒泡事件。

chatManager.UserConnected += (param1, param2) => { 
    //your code here 
}; 
+2

使用匿名代理來連接事件是一個很好的方式,最終會導致不會被垃圾收集的實例。 –

+0

同意。這只是一個基本的實現。有更多優雅的方式來處理這種事情。 –