7

ASP.NET MVC3 アプリケーションで StructureMap から Simple Injector に移行中です。

コントローラー DI に MVC3 拡張機能を使用していますが、StructureMap の静的な側面を置き換えようとすると問題が発生します。への電話があります

StructureMap.ObjectFactory.GetInstance<Interface>()

アプリのさまざまなレイヤー全体。Simple Injector にはそれを行う方法があるようには見えません。

何か不足していますか?または、Simple Injector は私のアプリケーションには適用できませんか?

あらかじめご了承ください。

4

1 に答える 1

15

アプリケーションがコンテナーに直接アクセスできるようにすることは、悪い習慣と見なされます。これはService Locator アンチパターンの一種です。

これは悪いことだと考えられているため、Simple Injector には StructureMap のようなものは含まれていませんObjectFactory.GetInstance。実際のところ、StructureMap の作成者は、StructureMapの今後のリリースで API を削除することを検討しています。ObjectFactory

SimpleInjector.Containerただし、静的フィールドにインスタンスを格納し、アプリケーションにこれを使用させることを止めるものは何もありません。

// Service Locator implementation in low application layer.
public static class ObjectFactory
{
    private static SimpleInjector.Container container;
    
    public static void SetContainer(Container container)
    {
        ObjectFactory.container = container;
    }
    
    public static T GetInstance<T>() where T : class
    {
        return container.GetInstance<T>();
    }
}

コンポジションルート:

public static void Initialize()
{
   var container = new Container();      

   InitializeContainer(container);
   
   DependencyResolver.SetResolver(
        new SimpleInjectorDependencyResolver(container));   

   // Set the service locator here
   ObjectFactory.SetContainer(container);
}

したがって、Simple Injector には、これを行うことを妨げる制限はありませんが、率直に言って、Service Locator が良くない理由の 1 つをすでに目の当たりにしています。つまり、コンテナーを切り替えたため、アプリケーション コードを変更する必要があります。

おそらく今のところ、静的フィールドにコンテナーを保存するのが最も簡単ですが (上記の例に示すように)、時間をかけてこのパターンが悪い理由を理解し、このパターンから依存関係の注入に向けてリファクタリングしてください (そして、特にコンストラクター注入)。

于 2012-08-03T14:13:36.867 に答える