Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf MVVM:依赖注入和按需创建ViewModels_Wpf_Mvvm_Ninject - Fatal编程技术网

Wpf MVVM:依赖注入和按需创建ViewModels

Wpf MVVM:依赖注入和按需创建ViewModels,wpf,mvvm,ninject,Wpf,Mvvm,Ninject,我正在用MVVM和Ninject为DI打包一个小型WPF应用程序(这是第一次) 为静态UI元素创建“单实例”视图模型很容易。但是我正在努力解决ViewModels的问题,它是根据需要创建的,例如,在用户操作上,它不能被注入,但必须以某种方式在类本身中创建 最简单的方法是注入Ninject内核或使其在全球范围内可用,但我认为这是一种糟糕的做法 在寻找解决方案的过程中,我尝试了以下两种方法: ViewModelLocator:我认为它更适用于“单实例”ViewModels,因为我使用DataTem

我正在用MVVM和Ninject为DI打包一个小型WPF应用程序(这是第一次)

为静态UI元素创建“单实例”视图模型很容易。但是我正在努力解决ViewModels的问题,它是根据需要创建的,例如,在用户操作上,它不能被注入,但必须以某种方式在类本身中创建

最简单的方法是注入Ninject内核或使其在全球范围内可用,但我认为这是一种糟糕的做法

在寻找解决方案的过程中,我尝试了以下两种方法:

  • ViewModelLocator:我认为它更适用于“单实例”ViewModels,因为我使用DataTemplates将ViewModel与视图连接起来(ViewModel优先),我觉得这不是正确的方法,但也许我会将其集成到我的单例中(如果使用WPF DataTemplates有意义的话?)

  • Factory模式:我读过关于使用抽象工厂创建对象以及将工厂注入ViewModels中的内容,然后ViewModels可以根据需要使用它创建动态ViewModels。听起来很简单,这就是为什么我有疑问,如果它只是重新定位问题

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

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

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


Prism的维护者之一Brian Lagunas有一个。请注意,尽管Prism非常庞大,提供了大量的功能,但您不需要使用所有功能。

使用工厂模式。 正如马克·希曼(Mark Seemann)所描述的那样,工厂本身也应该成为该计划的一部分


为了使事情变得简单,你可以使用。

那么你的问题是,具体是什么?你需要建议吗?工厂模式非常有效!是的,我需要一个建议。如果
InnerVM
没有太多依赖项,您可以选择
new InnerVM()
自己,或者选择
InnerVMFactory.Create()
它,这样更干净。您的
OuterVM
将依赖于
innervfactory
。好的,这就是我所想象的。工厂对Ninject内核的依赖是完全有效的吗?不,工厂对Ninject内核没有依赖。工厂执行
新的InnerVM()
。它的依赖项是
InnerVM
所具有的任何依赖项,它在每个
Create()
中向
InnerVM
提供这些依赖项。我喜欢ViewModelLocator类的想法,在这个类中,我可以为设计目的模拟ViewModels。但是正如我提到的,我也喜欢DataTemplates的便利性,它可以将我的ViewModels连接到视图。我认为不可能同时使用这两种模式,所以我使用Ninject.Extensions.Factory为我的ViewModels创建了一个工厂。实现了我自己的
IInstanceProvider
,它依赖于
IEventBroker
。InstanceProvider由工厂使用。全部连接在合成根中。非常感谢。我想你应该把工厂注入到你的主视图模型中,然后把它传递到你的视图模型树的深处去创建子视图模型?@Wouter:不完全。所有视图模型都是由Ninject(整个树)创建的。将创建新ViewModels的节点将依赖于工厂,因此Ninject将注入工厂。因此,我没有工作来传递实例,所有内容都被捆绑在合成根中。