使用Unity创建视图和视图模型
使用Unity作为依赖注入容器与使用类似 MEF,以及基于属性和基于构造函数的注入 支持的。主要区别在于类型通常是 在运行时没有隐含发现;相反,他们必须 在容器中注册。
通常,您在视图模型上定义一个接口,以便视图 模型的特定具体类型可以与视图分离。对于 例如,视图可以通过a定义其对视图模型的依赖性 构造函数参数,如此处所示。 C#
public QuestionnaireView() { InitializeComponent(); } public QuestionnaireView(QuestionnaireViewModel viewModel) : this() { this.DataContext = viewModel; }
默认参数少 构造函数是必要的,以允许视图在设计时工作 工具,例如Visual Studio和Expression Blend。
或者,您可以在上面定义只写视图模型属性 查看,如此处所示。 Unity将实例化所需的视图模型 在实例化视图后调用属性setter。 C#
public QuestionnaireView() { InitializeComponent(); } [Dependency] public QuestionnaireViewModel ViewModel { set { this.DataContext = value; } }
视图模型类型已在Unity容器中注册,如图所示 这里。 C#
IUnityContainer container; container.RegisterType<QuestionnaireViewModel>();
然后可以通过容器实例化视图,如图所示 这里。 C#
IUnityContainer container; var view = container.Resolve<QuestionnaireView>();
如果我省略了有关注册ViewModel和实例化View的代码的最后部分,并且只使用将ViewModel挂钩到View的两种方法中的任何一种(使用构造函数或使用属性),那么看起来是ViewModel和View似乎一切都运转良好。那么代码注册ViewModel并实例化View的需求是什么?
第一个例子,使用构造函数钩住View和ViewModel,没有提到Unity的全部,所以Unity实际上在这里使用了吗?
使用基于属性的注射比使用基于构造的注射有任何优势还是它们完全相同?
文本的第一部分说“*通常,您在视图模型上定义一个接口,以便视图模型的特定具体类型可以与视图分离”,然后给出一个示例。然而,这个例子根本没有提到接口。这里发生了什么,我错过了什么?