主にユニットのテスト容易性を向上させるために、WPFアプリケーションで依存性注入の使用を開始したいと思います。私のアプリは主にMV-VMパターンに沿って構築されています。私はIoCコンテナのAutofacを見ていますが、それはこの議論にとってそれほど重要ではないと思います。
App.xaml.csでコンテナーを作成して解決できるため、開始ウィンドウにサービスを挿入するのは簡単なようです。
私が苦労しているのは、ViewModelsとServicesをユーザーコントロールにDIする方法です。ユーザーコントロールは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>();