2012-03-26 57 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

相关问题