我目前正在学习MVVM和我一直使用的教程,只使用一个View Model和一个Model.视图模型注入了Model接口,如下所示:
public ViewModel(IQuoteSource quoteSource)
{
}
这是通过DI使用Unity处理的.我的问题是如果VM依赖于多个模型,比如任意6或7?我们只是将它们中的每一个注入ctor中,还是应该有单独的VM?
或者每个模型是否应该尝试实现一个特定的接口,该接口会暴露一些方法/事件,例如注册挂钩,然后在数据更新后发生事件?
谢谢.
最佳答案 这是您的VM依赖的许多模型.您可以在构造函数上注入所有这些,这使依赖更加明确和可见.或者您可以让VM从Unity容器中解析各种模型:
public ViewModel(IUnityContainer container)
{
IQuoteSource model1 = container.Resolve<IQuoteSource>();
... etc ...
}
当使用Unity解析具体实例并且您没有在Resolve()调用中指定任何构造函数参数时,Unity将检查从最复杂到最基本的构造函数,如果它找到一个接受Unity容器然后它将使用它(如果找到它们,它将首先使用其他人.)因此,如果您的VM在构造函数中使用Unity容器,则它可以使用该容器进一步解析它所需的任何内容.
有些人可能会争论哪种方法更合适 – 直接注入所有必需的依赖项,或只注入具有依赖项的容器. IMVHO对这两种方法都有积极的和消极的,使用哪种方式更适合你的风格.
您还可以考虑在某种程度上重构代码,也可以引入一个新模型,它是几个现有模型的外观.另一种可能性是你所谓的模型实际上可能更适合作为服务(这是一个告诉我的标志,如果模型在几个地方用来从特定来源获取数据,如果是这种情况那么你可以将该功能分离到Unity容器中的服务和购物车中,以便在必要时使用它.
1参考:Telling Unity Which Constructor to Use when Initializing a Class