我想开始在我的 WPF 应用程序中使用依赖注入,主要是为了更好的单元可测试性。我的应用程序主要是按照 MV-VM 模式构建的。我正在为我的 IoC 容器寻找Autofac,但我认为这对这个讨论没有太大影响。
将服务注入启动窗口似乎很简单,因为我可以在 App.xaml.cs 中创建容器并从中解析。
我正在苦苦挣扎的是如何将 DI ViewModels 和服务转换为用户控件?用户控件是通过 XAML 标记实例化的,因此它们没有机会Resolve()
。
我能想到的最好的办法是将容器放在单例中,并让用户控件从全局容器中解析他们的 ViewModel。充其量,这感觉像是一个半途而废的解决方案,因为它仍然需要我的组件依赖于 ServiceLocator。
使用 WPF 可以实现完整的 IoC 吗?
[编辑] - 有人建议使用 Prism,但即使评估 Prism 似乎也是一项巨大的投资。我希望有更小的东西。
[编辑] 这是我停止的代码片段
//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>();