2010-06-01 43 views
7

我在一個大的項目有幾大部件的完成階段:圖像採集,圖像處理,數據存儲,工廠I/O(自動化項目)和其他幾個人。MVVM和避免單片上帝對象

每個組件的合理獨立的,但對於該項目作爲一個整體來看,我需要每個組件的至少一個實例。每個組件還具有用於監視狀態和更改事物的ViewModel和View(WPF)。

我的問題是實例化所有這些對象的最安全,最有效,最可維護的方法,在另一個事件中爲一個事件訂閱一個類,併爲所有這些對象提供一個共同的ViewModel和View。

會是最好的,如果我有一個叫神類,它具有所有這些對象的私有實例?我過去做過這件事,並對此表示遺憾。

或者它會更好,如果上帝對這些對象的單身實例依賴於讓球滾動。另外,如果Program.cs(或Main(...)所在的任何位置)實例化所有這些組件,並將它們作爲參數傳遞給上帝,然後讓Him(snicker)和他的ViewModel處理運行的細節這個項目。

任何其他建議,我很想聽聽。

謝謝!

回答

2

我得到的ViewModels的首選方法是使用ViewModelLocater。基本上它就像你暗示的上帝對象,但它的唯一的責任是創建每個ViewModel並保存對它的引用。我通常將VML添加到應用程序的資源中,每個視圖負責將其DataContext設置爲正確的ViewModel。如果您正在訂閱多個事件,則可以使用VML手動連接它們,也可以創建先引發事件並將其傳遞給構造函數中的相關VM的VM。

+0

我已經嘗試過每一個非第三方的方法,除了最後一個失敗了一定程度之外,每一次嘗試都會失敗,並最終解決了與ViewModelLocater模式非常接近的問題。我確信其他人發佈的第三方框架會爲我節省很多工作,但爲此我太遲了。這個答案是一個很好的中間立場。我認爲你也學到了很難的方法。無論如何,這裏我們幾個月後,但 - 謝謝你! – bufferz 2010-09-18 02:36:56

0

我希望我能很好地理解你的問題。我認爲使用God ViewModel並不是一個好主意。最好爲每個視圖提供一個單獨的視圖模型,並在該視圖模型中實例化所有相關的視圖模型。那麼你可以使用中介來安全地在該視圖的視圖模型和其他視圖之間發送消息。我也建議使用wpf命令而不是事件。你可以在here找到一篇關於介體的文章。

3

這些問題採取很好地使用護理微軟的 「複合應用程序庫」(又名棱鏡),用於開發複合WPF應用程序的框架:

http://msdn.microsoft.com/en-us/library/ff647752.aspx

http://msdn.microsoft.com/en-us/library/ff648611.aspx

  • 創作您的觀點:棱鏡有一個應用程序外殼窗口和區域管理器的概念。該shell充當裸骨佈局頁面,您可以在其中定義命名的佔位符區域,例如「MainMenu」和「TabInterface」。您可以在模塊類中引用視圖和視圖模型,例如「MainMenuModule」和「TabInterfaceModule」,並定義模塊應與哪個區域相關聯。當應用程序啓動時,Prism將創建您的視圖並將它們注入到外殼區域。這使您可以彼此獨立地編寫視圖。

  • viewmodels之間的通信:Prism支持稱爲「Event Aggregator」的中介模式。基本上,您可以通過視圖模型中的事件agregator發佈和訂閱消息。這允許視圖模型通過消息鬆散地進行通信,而不必相互瞭解並掛鉤事件。

棱鏡主張並支持以鬆散耦合的方式彼此獨立地開發組件圖案,而不會引入對象神和過耦合。 Prism的很大一部分也是使用IOC和依賴注入,所以單元測試也變得更加容易。

我發現下面的文章很好的實用介紹如何使用棱鏡和MVVM:

http://www.developmentalmadness.com/archive/2009/10/03/mvvm-with-prism-101-ndash-part-1-the-bootstrapper.aspx

3

看看一些依賴注入框架,如統一(這CAL使用),溫莎城堡或春季。淨。

1

您可能會使用控制器(ApplicationController,Use-Case Controllers)而不是「上帝」類。控制器負責創建ViewModel對象,並在它們之間進行調解。

工作原理如圖所示WPF Application Framework (WAF)項目。