14

私はまだ Autofac を使い始めたばかりで、ドキュメントと例で見逃していることの 1 つは、Web アプリケーションのさまざまな場所から構成済みのコンテナーに簡単にアクセスできるようにする方法です。

Autofac コントローラー ファクトリを使用して、コンストラクターによって注入されたコントローラーの依存関係を自動的に解決できることはわかっていますが、まだ注入されていない、解決する必要がある可能性のある他のものについてはどうですか。

これについて私が気付いていない明らかなパターンはありますか?

ありがとうございました!

4

5 に答える 5

32

Autofacの「方法」は、IContextコンストラクターパラメーターを持つことです。Autofac は、型の解決に使用できるオブジェクトを注入します。

コンテキストは通常​​、舞台裏のコンテナーであり、インターフェースをIContainer実装しますが、解決のみを行うことに制限されています。IContextIContext

コンテナーを「過度に使用」してはならないことはわかっていますが、OP として、事前にわかっていない型を解決する必要がある (したがって、コンストラクターのパラメーターとして使用できない) クラスがあります。このような場合、コンテナーを、他のサービスを解決するために使用できるさらに別のサービスと考えて、他のサービスと同じように注入すると便利です。

IContext を使用すると Autofac にバインドされ、それを独自のインターフェイスで抽象化する必要があると思われる場合はIContext、コンテナーにラッパー クラスを登録するだけです。

更新: Autofac 2 では、IContextは と呼ばれIComponentContextます。

于 2009-07-20T16:16:41.007 に答える
12

まず、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 にも適用できます)

于 2009-03-13T21:59:28.293 に答える
8

IOC コンテナーをグローバルに使用できるようにすることは、ベスト プラクティスではありません。コンテナを渡すことさえ奨励されていません

依存性注入を使用できない場合 (コンポーネントの作成後にオブジェクトを作成\要求する必要があります)、次のことができます。

  1. 手作業でコーディングされたファクトリを使用します (ファクトリはコンポーネントに注入され、コンポーネントはファクトリを使用して他のオブジェクトを作成します)
  2. Autofacデリゲート ファクトリまたはAutofac 2 の新しい自動生成ファクトリを使用します。
于 2009-11-10T06:51:44.787 に答える
6

上記の Peter Lillevold の回答は正しいです。IContext インターフェイスに依存することで、任意のコンポーネントからコンテナーにアクセスできます。

実際のコンテナー参照がどうしても必要な場合は、Autofac.Integration.Web.IContainerProviderAccessor を参照してください。

于 2009-08-01T20:18:10.277 に答える
1

これを行う通常の方法は、コンテナーをグローバル アプリ クラスの静的変数に格納することです。

于 2009-03-13T21:52:29.107 に答える