2012-10-26 40 views
3

我閱讀了關於在MVVM設計中實現的Event Aggregator模式可以幫助解耦ViewModels之間的通信。是否僅針對MVVM中的ViewModels使用EventAggregator?

我認爲Event Aggregator真的是個好主意。但是第二個想法是,ViewModels只使用Event Aggregator嗎?模型可以在Event Aggregator中發佈和訂閱事件嗎?

而且,通過這個,或許可以通過EventAggregator將ViewModel和Model之間的數據更改關聯起來。這可能會允許一個ViewModel從多個模型中檢索信息,而不需要ViewModel存儲對所有模型的引用。

如果我這樣做,是否會導致整個架構變得混亂並最終成爲反模式?最佳做法是什麼?

編輯:

我想我應該解釋一下爲什麼我問這一點。我看到三個可能的問題:

第一個,所以用DI,我的ViewModel包裝模型。然後,我的ViewModel可以與我的模型進行通信。但是,並非如此。因此,如果我的模型在其自身或外部進行了一些更改,則需要通知其ViewModel。

第二個,除了ViewModels必須與其他ViewModel進行通信外,在我看來,模型必須與ViewModel一樣,甚至更多地與其他模型進行通信。這些導致我認爲我可以將所有鏈接到EventAggregator的東西都鏈接起來。

第三,我發現有些情況下,單個ViewModel需要從多個模型中提取信息。但通過ViewModel的構造函數通過依賴注入,它只能從一個Model讀取。

+0

我的直接反應是,它似乎不正確。因爲你可能只是通過一個接口在Model&ViewModel之間使用依賴注入。所以你不會手動管理用戶/出版商... – Johnny

+0

@Johnny是的,我可以通過一個接口使用DI。但是我看到了兩個可能的問題:首先,在DI中,我的ViewModel封裝了模型。然後,我的ViewModel可以與我的模型進行通信。但是,並非如此。因此,如果我的模型在其自身或外部進行了一些更改,則需要通知其ViewModel。其次,除了ViewModel必須與其他ViewModel進行通信外,在我看來,模型必須像ViewModel一樣與其他模型進行交互,甚至更多。這些導致我認爲我可以將所有鏈接到EventAggregator的東西都鏈接起來。 – Carven

+0

好吧,其實我看到了3個可能的問題,這些問題引起了我的這個問題。我以這個問題的動機更新了我的問題。 – Carven

回答

6

有幾個地方,你可能要使用的事件聚合:

  1. 在視圖模型的水平,這樣的ViewModels可以發送,可以由有興趣或收到有關事件的消息其它對象receivd通知他們對此感興趣。
  2. 在模型發送數據流的服務(或模型)級別。而不是通過方法調用請求數據的視圖模型,它只會接收「新數據」事件。
  3. 如果您有多個服務向視圖模型提供相同的數據,它可以將數據聚合成一個流。
  4. 您有一個系統範圍的事件(系統關閉),可讓您的視圖模型和/或服務知道他們必須正常終止。這給他們時間來關閉。

這是值得牢記,有缺點使用事件聚合:

  1. 它增加了一個級別或間接,使得代碼難以閱讀。根據您擁有的開發工具,映射事件發佈者和訂閱者可能會造成麻煩。
  2. 它需要一定量的「腳手架」代碼才能使其工作。如果它被過度使用(你需要跟蹤哪些事件做什麼等),這可能成爲一種負擔。
  3. 如果僅用於簡單的數據請求,則大多數情況下用事件agregator事件替換服務方法不起作用。每個方法調用需要2個事件(一個請求和一個響應事件)。您還必須小心地發送錯誤的viewmodel數據:如果viewmodel A發送數據請求,並且viewmodel A和B接收到響應,那麼您必須能夠使viewmodel B過濾出響應。

通常我不使用事件聚合器爲服務通信提供服務(在我的主要工作項目中,我們有20個事件,其中只有1個服務是服務)。這是因爲我的大部分服務調用都是簡單的一次性數據請求,而不是連續的更新。

相關問題