使用WPF应用程序可以实现依赖注入吗?

前端之家收集整理的这篇文章主要介绍了使用WPF应用程序可以实现依赖注入吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想开始在我的WPF应用程序中使用依赖注入,主要是为了更好的单元可测试性。我的应用程序大多沿着M-V-VM模式构建。
我正在寻找 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

猜你在找的设计模式相关文章