当我想编写好的MVVM程序时,我可以在View代码中使用Unity Container吗?
this.DataContext = uc.Resolve<MainViewModel>();
答案 0 :(得分:2)
如果你问你是否可以,是的。
如果你问你是否应该,答案仍然是肯定的。
答案 1 :(得分:1)
ServiceLocator是一种反模式,你不应该使用它。它是反模式的原因是因为它允许在任何时候在类中解析对象,降低了DI的有用性并使代码更难以进行单元测试。
我的建议是做以下其中一项:
a)通过构造函数将viewmodel注入视图。使用Unity解析视图,以便它为您解析所有视图依赖项(视图模型)。
所以:
public partial class查看:UserControl,IViewFoo { 公共视图(IViewModel viewModel) { 的DataContext =视图模型; }
var view = _container.Resolve(); }
b)中
使用附加属性将viewmodel注入DataContext。 MEFEDMVVM和MVVMLite都这样做(在Codeplex上查找)
c)中 遵循基于约定的方法,其中视图模型基于具有兼容名称(MainView.cs和MainViewModel.cs)的视图被分配给视图。 Caliburn Micro做到了这一点并且非常好用。这也可以在CodePlex上找到。