2

ときどき、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 パターンを再発明しただけですか?

コンテナを渡すのは悪い考えだとわかっているので、これで問題は解決し、コンテナに依存しませんが、これは見栄えが良いですか、それとも単なる悪い考えですか?

4

0 に答える 0