這是自從我開始使用MVVM以來,我一直在努力的一個問題,首先在WPF中,現在在Silverlight中。MVVM和IOC:處理查看模型的類不變量
我使用IOC容器來管理Views和ViewModels的分辨率。視圖往往是非常基本的,有一個默認的構造函數,但ViewModels傾向於訪問真正的服務,所有這些都是構建所需的。再次,我使用IOC容器來解決問題,所以注入服務不是問題。
成爲問題的是將所需數據通過IOC傳遞給ViewModel。作爲一個簡單的例子,考慮一個允許編輯客戶的屏幕。除了可能需要的任何服務之外,此屏幕的ViewModel還需要客戶對象來顯示/編輯客戶的數據。當做任何類型的(非MVVM)庫開發時,我認爲它是一個不可修改的規則,類不變量是通過構造函數傳遞的。如果我需要上下文相關的數據來建造課程時間和所討論的類是容器管理的,我傾向於使用抽象工廠*作爲橋樑。在MVVM中,這看起來像是矯枉過正,因爲大多數ViewModel都需要自己的工廠。 (1)初始化/加載方法,其中我傳遞數據,這違反了通過構造函數強制類不變量的規則,(2)通過容器傳遞數據,如下所示:參數覆蓋(Unity),以及(3)通過全局狀態包(ugh)傳遞數據。
將特定於上下文的數據從一個ViewModel傳遞到下一個的一些備選方法是什麼?是否有任何MVVM框架解決這個特定的問題?
* 它可能有它自己的問題,例如要求在對Container.Resolve()的調用之間進行選擇,或者沒有對ViewModel進行容器管理。溫莎城堡有一個很好的解決方案,但AFAIK沒有其他框架。
編輯:
我忘了補充:一些我列出的選項中甚至沒有可能的,如果你正在做的「檢視首個」 MVVM,除非你先通過數據的視圖,然後到視圖模型。
謝謝你提出這個問題。我偶然發現瞭如何將數據傳遞給ViewModel的困境。幸運的是,使用autofac的自動生成委託工廠,我只有不必一路去聲明一個全接口聲明的工廠,但它仍然是非常冗長。 – Ants 2011-06-15 06:49:01