MVVM:依赖注入和按需创建 ViewModel
MVVM: Dependency Injection and creating ViewModels on demand
我正在使用 MVVM 和 Ninject 为 DI(第一次)构建一个小型 WPF 应用程序。
为静态 UI 元素创建我的 "Single Instance" ViewModels 很容易。但是我正在为按需创建的 ViewModels 而苦苦挣扎,例如关于用户操作,无法注入,但必须以某种方式在 class 本身中创建。
最简单的方法是注入 Ninject 内核或使其全局可用,但我认为这是不好的做法。
在寻找解决方案时,我偶然发现了这两个:
ViewModelLocator:我认为它更适用于 "Single Instance" ViewModel,因为我正在使用 DataTemplates 将 ViewModel 与 View 连接起来(首先是 ViewModel),我觉得它不是正确的方法,但也许我会为我的单例集成它(如果使用 WPF DataTemplates 确实有意义?)。
工厂模式:我阅读了有关使用抽象工厂创建对象并将工厂注入 ViewModel 的信息,然后可以使用它按需创建动态 ViewModel。听起来很简单,这就是我怀疑的原因,如果它只是重新定位问题?
所以基本上我试图通过 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。
我正在使用 MVVM 和 Ninject 为 DI(第一次)构建一个小型 WPF 应用程序。
为静态 UI 元素创建我的 "Single Instance" ViewModels 很容易。但是我正在为按需创建的 ViewModels 而苦苦挣扎,例如关于用户操作,无法注入,但必须以某种方式在 class 本身中创建。
最简单的方法是注入 Ninject 内核或使其全局可用,但我认为这是不好的做法。
在寻找解决方案时,我偶然发现了这两个:
ViewModelLocator:我认为它更适用于 "Single Instance" ViewModel,因为我正在使用 DataTemplates 将 ViewModel 与 View 连接起来(首先是 ViewModel),我觉得它不是正确的方法,但也许我会为我的单例集成它(如果使用 WPF DataTemplates 确实有意义?)。
工厂模式:我阅读了有关使用抽象工厂创建对象并将工厂注入 ViewModel 的信息,然后可以使用它按需创建动态 ViewModel。听起来很简单,这就是我怀疑的原因,如果它只是重新定位问题?
所以基本上我试图通过 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。