当我想编写好的MVVM程序时,我可以在View的代码隐藏中使用UnityContainer吗?我可以在View的代码隐藏中使用UnityCOntainer吗? (MVVM)
this.DataContext = uc.Resolve<MainViewModel>();
当我想编写好的MVVM程序时,我可以在View的代码隐藏中使用UnityContainer吗?我可以在View的代码隐藏中使用UnityCOntainer吗? (MVVM)
this.DataContext = uc.Resolve<MainViewModel>();
ServiceLocator是一种反模式,你不应该使用它。它是一种反模式的原因是因为它允许随时在类内部解析对象,从而降低了DI的实用性,并使您的代码更难于进行单元测试。
我的建议是做下列之一:
一)注入到视图模型通过它的构造函数的观点。使用Unity解析视图,以便为您解析所有视图依赖关系(视图模型)。
所以:
公共部分类查看:用户控件,IViewFoo { 公共视图(IViewModel视图模型) { 的DataContext =视图模型; }
var view = _container.Resolve(); }
B)
使用附加属性的视图模型注入的DataContext你。 MEFEDMVVM和MVVMLite都做到这一点(看看他们在Codeplex)
C) 遵循以公约为基础的方法,把视图模型被分配给基于他们有兼容的名称(MainView.cs和MainViewModel.cs)的观点。 Caliburn Micro可以做到这一点,使用起来非常好。这也可以在CodePlex上找到。
非常有帮助,thx! – Arvangen 2012-04-01 23:21:24
如果你问是否可以,是的。
如果你问你是否应该,答案仍然是。
虽然我同意,但我会建议使用ServiceLocator,您不需要将容器传遍整个地方。 – cadrell0 2012-03-26 19:19:09
当然最好的方法是使用构造函数注入,因为视图不应该真正引用MVVM模式中的统一容器? – 2012-03-26 20:00:54
是的,你可以。这里有更深层次的问题吗?你有没有尝试这样做,并得到一个错误?你在问最佳做法吗? – cadrell0 2012-03-26 17:47:05
这就是我现在想知道的:)但是如果你已经在这里,那么设置视图DataContext的最佳做法是什么? – Arvangen 2012-03-26 17:53:22