【发布时间】:2010-09-22 01:05:05
【问题描述】:
我想开始在我的 WPF 应用程序中使用依赖注入,主要是为了更好的单元可测试性。我的应用程序主要是按照 M-V-VM 模式构建的。 我正在为我的 IoC 容器查看 Autofac,但我认为这对本次讨论没有太大影响。
将服务注入启动窗口似乎很简单,因为我可以在 App.xaml.cs 中创建容器并从中解析。
我正在努力解决的是如何将 DI ViewModel 和服务转换为用户控件?用户控件是通过 XAML 标记实例化的,因此没有机会Resolve() 它们。
我能想到的最好的办法是将容器放在单例中,并让用户控件从全局容器中解析其 ViewModel。充其量,这感觉像是一个半途而废的解决方案,因为它仍然需要我的组件依赖于 ServiceLocator。
使用 WPF 是否可以实现完整的 IoC?
[编辑] - 有人建议使用 Prism,但即使评估 Prism 似乎也是一项巨大的投资。我希望有更小的东西。
[edit] 这是我停止的代码片段
//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>();
【问题讨论】:
-
Glenn Block 通过播客和博客文章对 Prism 做了一些介绍 - 我认为评估它的投资并不多。
-
Scott,你看到的“大”投资是什么?你是在猜这个,还是你真的看过它? Prism 的设计方式是您可以只使用您需要的部件,没有大的承诺。我很乐意与您离线讨论此事。
标签: wpf design-patterns dependency-injection inversion-of-control autofac