我想开始在我的WPF应用程序中使用依赖注入,主要是为了更好的单元可测试性。我的应用程序大多沿着M-V-VM模式构建。
我正在寻找 autofac为我的IoC容器,但我不认为这是太重要的这个disucssion。
我正在寻找 autofac为我的IoC容器,但我不认为这是太重要的这个disucssion。
在启动窗口中注入服务似乎很简单,因为我可以创建容器并在App.xaml.cs中解析它。
我困惑的是我如何DI viewmodel和服务进入用户控件?用户控件通过XAML标记实例化,所以没有机会Resolve()它们。
我可以想到的最好的是将容器放在Singlton中,并让用户控件从全局容器中解析它们的viewmodel。这感觉就像一个半路的解决方案,最好的,因为它仍然需要我的组件有一个依赖于ServiceLocator。
是充分的IoC可能与WPF?
[编辑] – 棱镜已被提议,但即使评价棱镜似乎是一个大投资,我希望的东西更小
这里是一个代码片段,我停下来
//setup IoC container (in app.xaml.cs) var builder = new ContainerBuilder(); builder.Register<NewsSource>().As<INewsSource>(); builder.Register<Aviewmodel>().FactoryScoped(); var container = builder.Build(); // in user control ctor - // this doesn't work,where do I get the container from VM = container.Resolve<Aviewmodel>(); // in app.xaml.cs // this compiles,but I can't use this uc,//as the one I want in created via xaml in the primary window SomeUserControl uc = new SomeUserControl(); uc.VM = container.Resolve<Aviewmodel>();
这其实很容易做到。我们有这样的例子在Prism作为jedidja提到。您可以使viewmodel注入View或View注入viewmodel。在Prism StockTraderRI中,您将看到我们将View注入到viewmodel中。基本上发生的是View(和View接口)有一个Model属性。该属性在codebehind中实现,以将DataContext设置为值,例如:this.DataContext = value ;.在viewmodel的构造函数中,View被注入。然后设置View.Model = this;它将自身作为DataContext传递。
你也可以轻松地做反向和viewmodel注入到视图。我实际上更喜欢这个,因为它意味着viewmodel不再有任何反向引用的视图。这意味着当单元测试viewmodel时,您甚至没有Mock的视图。此外,它使代码更清洁,因为在视图的构造函数中,它只是将DataContext设置为注入的viewmodel。
我在“分离的表示模式”的视频录音中谈到了这一点,Jeremy Miller和我在Kaizenconf发了言。第一部分可以在这里找到http://www.vimeo.com/2189854。
希望这可以帮助,Glenn