标准的MvvmLight ViewModelLocator是反模式吗?如何缓解这种情况?

6
当我开始一个新的mvvm-wpf应用程序时,通常会在一开始就包含mvvm-light。这很好用,直到我的应用程序变得越来越大。沿着这条线路,ViewModelLocator变得非常庞大(各种ChildViewodels的许多ViewModels)。更进一步,我需要同一ViewModel的多个不同实例。(例如,在同一屏幕上与项目列表交互)。这就是问题所在,如何处理好这些问题并保持代码可测试性?因此,如果我想摆脱ViewModelLocator(它是反模式吗?感觉像是ServiceLocator),我应该转向ViewModel-first,并为所有ViewModel创建(许多)抽象工厂吗?
2个回答

0
ViewModelLocator是一个花哨的名称,用于控制反转(IoC)中使用导航总线。虽然这似乎是一种较新的技术,但导航总线实际上以不同的方式使用服务总线。如果您有一个静态(在VB中共享的)容器,则不会出现反模式。如果在ViewModels中传递容器,则会出现反模式。
在MVVM中要记住的事情是,它是一种多才多艺的设计模式,可以通过许多方式扩展它。大型项目的最佳解决方案是组件化设计(每个应用程序特性都在其自己的命名空间或项目中)。
设计图可能如下所示:
客户
- 模型 - 视图模型 - 服务
订单
- 模型 - 视图模型 - 服务
等等... 实际上,这取决于开发人员的偏好。只要您的设计保持一致即可。
进一步阅读: 为了更好地理解ViewModelLocator,请搜索“导航总线”。 为了更好地了解EventAggregator,请搜索“消息总线”。

0

如果您使用MVVMLight的内置IOC容器,那么是的。如果您使用AutoFac或Ninject等工具,则可以注册所有基于ViewModelBase的类。另一种选择是使用代码生成来生成ViewModelLocator。通过这两种方法,您可以将其简化为每个视图模型一行。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接