ときどき、IoC コンテナーを適切に使用するための良い方法を探していました。
- コンポジション ルートで厳密にコンテナを使用する。
- テスト容易性の問題を回避するために、一般的な ServiceLocator (または類似のもの) を使用しない。
私は現在、新しいことを学ぶための個人的なプロジェクトを開始しています。これは、他のテクノロジ、フレームワーク、パターン、およびプラクティスの中で WCF、EntityFramework を使用する WPF (4.5) MVVM アプリケーションであり、コンテナーを有効に活用するためにさまざまなアプローチを試してみたいと考えています。 、工場および関連するパターン。
私の頭に浮かんだアイデアの 1 つは、コンテナー参照を渡さずにコンポジション ルートでセットアップできるジェネリック ファクトリを作成することでした。これにより、テスト容易性の問題を回避できます。たとえば、工場を考えてみましょう:
class Factory
{
private static Dictionary<Type, Func<object>> Store = new Dictionary<Type,Func<object>>();
public static void Setup<T>(Func<T> Creation)
{
Store.Add(typeof(T), () => Creation());
}
public static T Create<T>()
{
Func<object> func = (from p in Store where p.Key == typeof(T) select p.Value).FirstOrDefault();
if (func != null) return (T)func();
return default(T);
}
}
したがって、次のような構成ルートで構成します。
Factory.Setup(() => container.Resolve<ITest>());
Factory.Setup<ISomeWcfService>(() => new SomeWcfService());
最後に、具象型を作成するには:
ITest t = Factory.Create<ITest>();
ISomeWcfService client = Factory.Create<ISomeWcfService>();
今の質問と考え:
servicelocator パターンを再発明しただけですか?
コンテナを渡すのは悪い考えだとわかっているので、これで問題は解決し、コンテナに依存しませんが、これは見栄えが良いですか、それとも単なる悪い考えですか?