MvvmLight的标准ViewModelLocator是AntiPattern吗?以及如何减轻这种影响?

时间:2017-02-12 09:14:05

标签: mvvm dependency-injection inversion-of-control mvvm-light

当启动一个新的mvvm-wpf-application时,我通常在开始时包含mvvm-light。这很好,直到我的应用程序增长。

ViewModelLocator沿线的一些地方变得庞大(许多ViewModel用于各种ChildViewodel)。甚至在兔子洞的下方,我需要同一个视图模型的多个不同实例。 (例如,对于要在同一屏幕上与之交互的项目列表)。这是斗争开始的地方,如何处理好的,始终如一地保持代码可测试?

所以,如果我想摆脱ViewModelLocator(它是一个antipattern?感觉就像一个ServiceLocator)我应该首先转移到ViewModel并为所有ViewModel创建(许多)抽象工厂吗?

2 个答案:

答案 0 :(得分:0)

ViewModelLocator是用于控制反转(IoC)的导航总线的奇特名称。虽然这似乎是一种较新的技术,但导航总线实际上是以不同的方式使用服务总线。如果你有一个静态(在VB中共享)容器,它不是反模式。如果您在ViewModels中传递容器,则会出现反模式。

MVVM要记住的是它是多功能的设计模式,你可以通过多种方式扩展它。大型项目的最佳解决方案是组件设计(一种设计,其中应用程序的每个功能都在其自己的命名空间或项目中)。

设计图可能如下所示:

  • 客户
    • 模型
    • 的ViewModels
    • 服务
  • 订单
    • 模型
    • 的ViewModels
    • 服务

...等 这真的取决于开发人员的味道。只要您的设计一致。

进一步阅读: 要更好地了解ViewModelLocator搜索导航总线。 要更好地了解EventAggregator,请搜索消息总线

答案 1 :(得分:0)

好吧,是的,如果您将内置 IOC 容器与 MVVMLight 一起使用。如果你使用 AutoFac 或 Ninject 之类的东西,你可以注册所有基于 ViewModelBase 的类。另一种选择是使用代码生成来生成 ViewModelLocator。使用这两种方法,您可以将其缩减为每个视图模型一行。

public MyViewModel MyView => serviceLocator.Resolve<MyViewModel>();