【发布时间】:2016-12-02 10:10:52
【问题描述】:
为什么要通过 MessengerInstance 的 Send 方法向订阅的接收者 viewModel 广播消息,导致内存泄漏的可能性(正如作者所说),并且担心注销和调试变得更加困难,而我可以创建一个公共方法在作为潜在接收者的 viewModel 中,然后从外部调用此公共方法,如下所示:
ServiceLocator.Current.GetInstance<MyViewModel1>().InitMyViewModel1();
【问题讨论】:
-
您不应在其他视图模型中使用 ServiceLocator,请参见此处:blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern 顺便说一句,如果您使用使用 WeakReferences 的 messenger 版本,则不必担心内存泄漏。我不确定 MVVM light messenger 是如何实现的。经过短暂的谷歌搜索,您似乎不必担心内存泄漏。
-
我没有发现反对在其他 ViewModel 中使用 ServiceLocator 的论点非常有说服力,因为它很好地满足了它的目的。
-
依赖被隐藏。 a) 测试要困难得多。 b)这是非常危险的,因为如果您只想使用内部具有 ServiceLocator 调用的 VM 类,您将在运行时遇到麻烦。如果您使用构造函数/属性 DI 注入所有内容,您将在启动应用程序时立即知道
标签: c# .net wpf mvvm mvvm-light