アプリケーションがコンテナーに直接アクセスできるようにすることは、悪い習慣と見なされます。これは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 つをすでに目の当たりにしています。つまり、コンテナーを切り替えたため、アプリケーション コードを変更する必要があります。
おそらく今のところ、静的フィールドにコンテナーを保存するのが最も簡単ですが (上記の例に示すように)、時間をかけてこのパターンが悪い理由を理解し、このパターンから依存関係の注入に向けてリファクタリングしてください (そして、特にコンストラクター注入)。