1

簡単な質問:
Castle Windsor には、XML から構成できる Spring.Net の「ルックアップ メソッド インジェクション」に似た機能があり、クラスが IoC コンテナーを認識することなく、コンテナーから一時的なインスタンスをフェッチする機能を提供しますか?

長い質問:
私は長年の Spring/Spring.Net ユーザーであり、プロジェクトを移植することによって Castle Windsor を試してきました。Spring.Net には「ルックアップ メソッド インジェクション」の概念があり、これは (Spring ドキュメントから)...

ルックアップ メソッド インジェクションは、コンテナが管理するオブジェクトのメソッドをオーバーライドして、コンテナ内の別の名前付きオブジェクトをルックアップした結果を返すコンテナの機能です。通常、ルックアップには、前のセクションで説明したシナリオのように、プロトタイプ オブジェクトが含まれます。Spring フレームワークは、System.Reflection.Emit 名前空間のクラスを使用してメソッドをオーバーライドするサブクラスを動的に生成することにより、このメソッド注入を実装します。

これが意味することは、次の場合...

public class SomeTransient
{
    // ... I have dependencies that need to be filled by IoC container
}

public class SomeClass
{
    public virtual void Work()
    {
        var o = CreateTransient();
    }

    public virtual SomeTransient CreateTransient() { }
}

CreateTransient メソッドをオーバーライドするように Spring に指示し、メソッドが呼び出されるたびに、そのメソッドが (依存関係が初期化された状態で) 新しいコンテナーによって作成された一時インスタンスを返すようにすることができます。これのユニークな部分は、Spring Framework への直接リンクを必要としないことです (たとえば、SomeClass は特定のインターフェースを実装する必要はありません)。

XML経由でこれを達成するためにCastle Windsorに似たようなものはありますか?

(最終的には XML 構成から離れますが、現時点ではそれを実行しようとしています)

4

1 に答える 1

2

キャッスルにはもっと良いものがあります。型付きファクトリー。デリゲートでも注入できます! http://stw.castleproject.org/Windsor.Typed-Factory-Facility-delegate-based-factories.ashx

動的生成コードに依存しないため、より優れており、よりきれいに見えます。

クラスは誰かがそのメソッドをオーバーライドすることに依存していないため、よりきれいに見えます。サブクラス化せずにこのクラスをテストすることは不可能です。

あなたが本当にこのようなことをしたいのなら、私は期待します:

public abstract class SomeClass
{
  public abstract SomeTransient CreateTransient();
}

だけど…またもや気分が乗らない。

編集 2

Unity 2 は、この種のデリゲート ファクトリをサポートしています。ここで詳細を読むことができます: http://www.truewill.net/myblog/index.php/2010/05/06/unity_2_0_combining_injectionfactory_and

@eiximenisに感謝

于 2010-10-27T14:40:29.327 に答える