2010-11-24 17 views
1

これは恐らく疑問な質問ですが、デリゲートやイベントをIOCコンテナ(ウィンザーなど)に登録することはできますか?代表者はCastle Windsor IOCコンテナに登録できますか?

私はアプリケーションの起動時に戦略パターンを実装して、イベント機能を登録する予定です。

代替案は、コンテナに登録するためのタイプのデリゲートを単純にラップすることです。

答えて

7

Windsorで登録する関数をラップするか、サブクラス化する必要はありません。他のコンポーネントと同じように動作します。他のコンポーネントと同様にFunc<int>を伝える必要がある場合は、他のコンポーネントと同様に、名前付きコンポーネントとサービスオーバーライドを使用します。例:

[Test] 
public void Example() { 
    var container = new DefaultKernel(); 
    container.Register(Component.For<Func<int>>().Instance(() => 42).Named("42")); 
    container.Register(Component.For<Func<int>>().Instance(() => 44).Named("44")); 
    container.Register(Component.For<Something>().DependsOn(ServiceOverride.ForKey("f").Eq("44"))); 
    var s = container.Resolve<Something>(); 
    Assert.AreEqual(44, s.I); 
} 

class Something { 
    private readonly int i; 
    public Something(Func<int> f) { 
     i = f(); 
    } 

    public int I { 
     get { return i; } 
    } 
} 

あなただけEvent wiring facilityを使用し、コンテナを使用して、イベント登録を切り離すために探している場合。

+0

ありがとうございます。これは強力な施設のようです。 – Ben

0

どうすれば依存性を解決できるのでしょうか?

クラスがFunc<bool>という種類の代理人を求めている場合、どのように異なる代議員を区別しますか?

デリゲートをラップする代わりに、デリゲートの名前を付けて機能セクションに結合することができるため、代案をラップするのが最適なソリューションです。

EDIT Castle Windsorには、IOCに登録されているインスタンスの名前付け方法があります。だから、可能ですが、各インスタンスに何らかの名前を付ける必要があります。 Mauricio Schefferのanswerを参照してください。

+0

グッドポイント再解決。私はデリゲートのラッピングに行くつもりです。あなたが名前付き型のように名前付き関数を渡すことができるなら、きちんとしているでしょう。 – Ben

+0

デリゲートの名前は、標準クラスのMyDelegate:Func {} –

+0

-1とすることができます。 –

0

これはうまく動作します。typed factory facilityを使用している場合は予期しない動作が発生する可能性があるので注意してください。デリゲートの依存関係により、プロキシファクトリの作成が発生することがあります。 this questionを参照してください。

関連する問題