0
为什么我应该通过MessengerInstance的Send方法将消息广播给订阅的接收方viewModels,从而导致内存泄漏的可能性(正如作者所提到的),并且担心注销和调试更困难,因为我只需在其中创建一个公共方法只有MVVM Light Messenger有什么好处?
ServiceLocator.Current.GetInstance<MyViewModel1>().InitMyViewModel1();
为什么我应该通过MessengerInstance的Send方法将消息广播给订阅的接收方viewModels,从而导致内存泄漏的可能性(正如作者所提到的),并且担心注销和调试更困难,因为我只需在其中创建一个公共方法只有MVVM Light Messenger有什么好处?
ServiceLocator.Current.GetInstance<MyViewModel1>().InitMyViewModel1();
使用Messenger时,没有依赖的项目之间的沟通,好了,试想一下:在ViewModel这是一个潜在的接收器,然后从外面如下调用该公共方法。我有projectA和ProjectB是独立于彼此没有依赖关系,都有共同的参考作为ProjectC。如果ProjectA需要ProjectB数据或副Versa,那么你可以使用Messenger或任何Eventaggator类互相沟通通过ProjectC通过发布从订阅乙同样...
你不应该在其他的ViewModels使用服务定位,在这里看到:http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/ 顺便说一句,如果你使用Messenger版本使用WeakReferences,那么你不应该担心内存泄漏。我不确定MVVM light messenger是如何实现的。在短暂的谷歌搜索似乎你不必担心内存泄漏。 – MistyK
我没有发现反对在其他ViewModel中使用ServiceLocator的观点非常有说服力,因为它的用途非常好。 – nmrlqa4
隐藏依赖项。 a)测试更困难。 b)这是非常危险的,因为如果你想简单地使用具有ServiceLocator调用的VM类,你会在运行时遇到麻烦。如果你使用构造函数/属性DI注入所有东西,那么当你启动你的应用程序时,你会马上知道它 – MistyK