2012-03-26 176 views
0

當我想編寫好的MVVM程序時,我可以在View的代碼隱藏中使用UnityContainer嗎?我可以在View的代碼隱藏中使用UnityCOntainer嗎? (MVVM)

this.DataContext = uc.Resolve<MainViewModel>(); 
+0

是的,你可以。這裏有更深層次的問題嗎?你有沒有嘗試這樣做,並得到一個錯誤?你在問最佳做法嗎? – cadrell0 2012-03-26 17:47:05

+0

這就是我現在想知道的:)但是如果你已經在這裏,那麼設置視圖DataContext的最佳做法是什麼? – Arvangen 2012-03-26 17:53:22

回答

1

ServiceLocator是一種反模式,你不應該使用它。它是一種反模式的原因是因爲它允許隨時在類內部解析對象,從而降低了DI的實用性,並使您的代碼更難於進行單元測試。

我的建議是做下列之一:

一)注入到視圖模型通過它的構造函數的觀點。使用Unity解析視圖,以便爲您解析所有視圖依賴關係(視圖模型)。

所以:

公共部分類查看:用戶控件,IViewFoo { 公共視圖(IViewModel視圖模型) { 的DataContext =視圖模型; }

var view = _container.Resolve(); }

B)

使用附加屬性的視圖模型注入的DataContext你。 MEFEDMVVM和MVVMLite都做到這一點(看看他們在Codeplex)

C) 遵循以公約爲基礎的方法,把視圖模型被分配給基於他們有兼容的名稱(MainView.cs和MainViewModel.cs)的觀點。 Caliburn Micro可以做到這一點,使用起來非常好。這也可以在CodePlex上找到。

+0

非常有幫助,thx! – Arvangen 2012-04-01 23:21:24

2

如果你問是否可以,是的。

如果你問你是否應該,答案仍然是。

+0

雖然我同意,但我會建議使用ServiceLocator,您不需要將容器傳遍整個地方。 – cadrell0 2012-03-26 19:19:09

+0

當然最好的方法是使用構造函數注入,因爲視圖不應該真正引用MVVM模式中的統一容器? – 2012-03-26 20:00:54

相關問題