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