まず、IoC コンテナーを過度に使用しないようにしてください。コントローラー、ビュー、およびサービスを「接続」するのに最適ですが、実行時に作成する必要があるオブジェクトは、コンテナーではなく、ファクトリ オブジェクトによって作成する必要があります。そうしないと、コード全体で Container.Resolve 呼び出しが行われ、コンテナーに結び付けられます。これらの余分な依存関係は、IC を使用する目的を無効にします。ほとんどの場合、アプリケーションのトップ レベルで 1 つまたは 2 つの依存関係を解決するだけで取得できます。その後、IoC コンテナーはほとんどの依存関係を再帰的に解決します。
プログラムの別の場所でコンテナーが必要な場合は、私がよく使用するトリックを次に示します。
public class Container : IContainer
{
readonly IWindsorContainer container;
public Container()
{
// Initialize container
container = new WindsorContainer(new XmlInterpreter(new FileResource("castle.xml")));
// Register yourself
container.Kernel.AddComponentInstance<IContainer>(this);
}
public T Resolve<T>()
{
return container.Resolve<T>();
}
}
このようにコンテナー クラスでコンテナーをラップします。コンストラクターでラップされたコンテナーに自分自身を追加します。コンテナーを必要とするクラスに IContainer を注入できるようになりました。(例はウィンザー城ですが、おそらく AutoFac にも適用できます)