2012-10-21 19 views
4

我正在嘗試從體系結構和設計的角度理解事件聚合器模式。我之前從未在WPF中使用Prism,但我正在研究它在MSDN上的工作原理。發佈到事件聚合器的每個小事件是否都需要是自己的空CompositePresentationEvent?

在我看來,對於每一個事件,用戶必須創建一個新的事件對象來擴展CompositePresentationEvent。它也似乎是新的事件對象沒有其他功能(它通常沒有自己的代碼)。

因此,例如:

一個AddNewStuffEvent會是什麼樣子:

public class AddNewStuffEvent : CompositePresentationEvent<Object> {} //The end of the class 

對於HealthChangeEvent

public class HealthChangeEvent: CompositePresentationEvent<Object> {} //The end of the class 

對於BookFlipEvent

public class BookFlipEvent: CompositePresentationEvent<Object> {} //The end of the class 

對於BookCloseEvent

public class BookCloseEvent: CompositePresentationEvent<Object> {} //The end of the class 

這可以永遠繼續下去,每一個小的小事件BookOpenEventBookTearEvent等,所以,在一個特定的命名空間中的文件夾,會有一個整體噸事件類的,和事件聚合器將在運行時加載所有這些事件對象。那就是,每一個小小的事件都需要一個空的課程?這是如何工作的?有什麼可以更好的方式呢?

+0

@dbaseman是對的,但我也同意你的看法,它似乎有點尷尬。不是因爲你需要創建幾十個小類 - 我根本不介意 - 但是因爲它使用* type *作爲* name *,而不是一個真正的類型,它是爲了實現強打字而彎曲一點語言,仍然比替代方式更好 –

回答

3

是的,每個事件類型都需要自己的類,您必須定義它。

它也出現了新的事件對象沒有比它

繼承等功能的目的很簡單,就是爲事件提供強類型。這使得編寫代碼來訂閱它們變得更加容易。即,訂閱代碼可以這樣寫:

aggregator.GetEvent<AddNewStuffEvent>().Subscribe(Handler); 

這是一個最好的辦法,以形式的替代品,如「神奇字符串」自力更生說aggregator.GetEvent("AddNewStuffEvent").Subscribe(Handler)(可以在編譯時進行驗證

+0

謝謝,但假如我打算使用這個Event Aggregator爲了數據綁定的目的?我很可能會爲每個房產更改事件創建一個類。哇! – Carven

+0

@xEnOn也許我錯過了一些東西,但爲什麼你需要這樣做? 'RaisePropertyChanged'仍然可以是一個事件,你不需要爲每個屬性單獨的類,對吧? – McGarnagle

+0

我並不完全在我的工作中使用WPF。我正在學習Prism中使用的架構設計,然後從中借鑑想法來創建我自己的。我的意圖是首先創建一個事件聚合器,然後基於這個事件聚合器,我在其上創建另一層數據綁定機制。所以,如果Event Aggregator必須爲每個事件都有一個單獨的事件類,那麼當我有很多屬性更改事件時,我擔心它可能不是很方便。 – Carven

相關問題