回答问题 1 和 4
在您的示例中,视图模型的类型为QuestionnaireViewModel
,这是一个具体的类。由于它是一个具体的类,因此当您使用以下命令解析视图时container.Resolve<QuestionnaireView>()
,unity将通过调用为您实例化视图模型container.Resolve<QuestionnaireViewModel>()
在幕后。
在这种情况下,注册视图模型是多余的。但是,当使用依赖注入时,您通常希望使用接口而不是类,因此您的构造函数将如下所示:
public QuestionnaireView(IQuestionnaireViewModel viewModel)
{
this.DataContext = viewModel;
}
现在您的构造函数接收一个接口而不是一个类作为参数,Unity 不知道您要使用该接口的哪个实现。为了告诉 Unity,您需要将视图模型注册到容器:
container.RegisterType<IQuestionnaireViewModel, QuestionnaireViewModel>();
所以现在当你解析你的视图时,Unity将查找它应该使用哪个类作为实现IQuestionnaireViewModel
,看到它是QuestionnaireViewModel
并使用它。
回答问题2
正在使用Unity,因为为了让构造函数获取其参数,您需要使用容器解析视图。如果您自己实例化视图,则不会使用 Unitynew QuestionnaireView()
,即不会发生构造函数或属性注入。
回答问题3
我认为这主要是关于什么更舒适以及您需要在哪里使用注射构件的问题。很多时候,您只想在构造函数中设置局部变量,而不是创建仅用于执行注入的属性。
不过,属性注入的一个好处是您可以使用container.BuildUp()
使用创建的实例的方法new
而不是container.Resolve<>()
。这样,即使在创建之后,您也可以将成员注入到属性中 - 这是构造函数注入无法做到的事情。