2016-12-02 47 views
0

为什么我应该通过MessengerInstance的Send方法将消息广播给订阅的接收方viewModels,从而导致内存泄漏的可能性(正如作者所提到的),并且担心注销和调试更困难,因为我只需在其中创建一个公共方法只有MVVM Light Messenger有什么好处?

ServiceLocator.Current.GetInstance<MyViewModel1>().InitMyViewModel1(); 
+0

你不应该在其他的ViewModels使用服务定位,在这里看到:http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/ 顺便说一句,如果你使用Messenger版本使用WeakReferences,那么你不应该担心内存泄漏。我不确定MVVM light messenger是如何实现的。在短暂的谷歌搜索似乎你不必担心内存泄漏。 – MistyK

+0

我没有发现反对在其他ViewModel中使用ServiceLocator的观点非常有说服力,因为它的用途非常好。 – nmrlqa4

+0

隐藏依赖项。 a)测试更困难。 b)这是非常危险的,因为如果你想简单地使用具有ServiceLocator调用的VM类,你会在运行时遇到麻烦。如果你使用构造函数/属性DI注入所有东西,那么当你启动你的应用程序时,你会马上知道它 – MistyK

回答

0

使用Messenger时,没有依赖的项目之间的沟通,好了,试想一下:在ViewModel这是一个潜在的接收器,然后从外面如下调用该公共方法。我有projectA和ProjectB是独立于彼此没有依赖关系,都有共同的参考作为ProjectC。如果ProjectA需要ProjectB数据或副Versa,那么你可以使用Messenger或任何Eventaggator类互相沟通通过ProjectC通过发布从订阅乙同样...