我正在使用MVVM和Ninject捆绑一个小型WPF应用程序用于DI(第一次)。
为静态UI元素创建我的“单实例”ViewModel很容易。但我正在努力应对按需创建的ViewModel,例如:用户操作,不能注入,但必须在类本身中创建 -
最简单的方法是注入Ninject内核或使其全局可用,但我认为这是不好的做法。
在寻找解决方案的过程中,我在这两个方面发生了争执:
ViewModelLocator:我认为它更适用于“单一实例”ViewModel,因为我使用DataTemplates将ViewModel与View(ViewModel优先)挂钩,我觉得它不是正确的方法,但也许我会将它整合到我的单身人士中(如果使用WPF DataTemplates确实有意义吗?)。
工厂模式:我读到了使用抽象工厂进行对象创建,只是将工厂注入到ViewModel中,然后可以使用它来按需创建动态ViewModel。听起来很简单,这就是为什么我有疑问,如果只是重新安置问题?
所以基本上我试图通过ViewModel Tree内部的Ninject Kernel获取一个ViewModel对象的实例,例如:由用户事件触发。 因为我正在为Ninject使用Event Broker,所以事件代理只能连接到Ninject创建的对象。这就是为什么我需要由Ninject创建/注入的ViewModel。
答案 0 :(得分:2)
使用工厂模式。 然后工厂本身应该成为composition root的一部分,正如Mark Seemann所描述的那样。
为简单起见,您可以使用Ninject.Extensions.Factory。
答案 1 :(得分:0)
我们广泛使用Prism一个相当大的MVVM框架。它是围绕依赖注入构建的,它提供了一个ViewModelLocator类,可以自动搜索ViewModel
类型,该类型在实例化时应注入View
。在内部,它使用静态服务定位器,但您不必担心它。
<UserControl x:class=".."
prism:ViewModelLocator.AutoWireViewModel="True">
Prism的维护者Brian Lagunas有一个nice writeup。请注意,尽管Prism很大并且提供了大量功能,但您并不需要使用所有功能。