MVVM:依赖注入和按需创建 ViewModel

MVVM: Dependency Injection and creating ViewModels on demand

我正在使用 MVVM 和 Ninject 为 DI(第一次)构建一个小型 WPF 应用程序。

为静态 UI 元素创建我的 "Single Instance" ViewModels 很容易。但是我正在为按需创建的 ViewModels 而苦苦挣扎,例如关于用户操作,无法注入,但必须以某种方式在 class 本身中创建。

最简单的方法是注入 Ninject 内核或使其全局可用,但我认为这是不好的做法。

在寻找解决方案时,我偶然发现了这两个:

所以基本上我试图通过 ViewModel 树中的 Ninject 内核获取 ViewModel 对象的实例,例如由用户事件触发。 因为我正在为 Ninject 使用事件代理,事件代理只连接到 Ninject 创建的对象。这就是为什么我需要我的 ViewModels created/injected by Ninject.

我们广泛使用Prism一个相当大的MVVM框架。它是围绕依赖注入构建的,它提供了一个 class ViewModelLocator,它会在实例化时自动搜索应该注入到 View 中的 ViewModel 类型。它在内部使用静态服务定位器,但您无需担心。

<UserControl x:class=".."
    prism:ViewModelLocator.AutoWireViewModel="True">

Prism 的维护者之一 Brian Lagunas 拥有 nice writeup。请注意,尽管 Prism 很大并且提供了大量功能,但您不需要使用所有功能。

采用工厂模式。 正如 Mark Seemann 所描述的那样,工厂本身应该是 composition root 的一部分。

为了简单起见,您可以使用 Ninject.Extensions.Factory