3

次のコンストラクター署名でIRofl呼び出される実装を持つインターフェースがあります。DefaultRofl

public DefaultRofl(ICanHasCheezburger cheez)

ICanHasCheezburgerにはいくつかの実装があり、そのうちの1つをIoCコンテナで解決する必要があり、名前付き登録がこれに対する正しい方法だと思いました。

事前に作成されたインスタンスが2つあり、1つをデフォルトの登録にし、もう1つを次の名前にしたいとします。

container.Register<ICanHasCheezburger>(cheez1);
container.Register<ICanHasCheezburger>(cheez2, "x2");

DefaultRoflここで、「x2」登録を解決する必要があることを指定する必要があります。これが行き詰まっています。Autofacがこれを実行できることは知っていますが、TinyIoCで方法を見つけることができません。

私はこれを行う方法が

container.Register<IRofl, DefaultRofl>().UsingConstructor(() => new DefaultRofl(container.Resolve<ICanHasCheezburger>("x2")));

しかし、結局のところ(そして私はその理由をある程度理解しています)、ICanHasCheezburgerコンストラクターパラメーターは単なるダミーであり、実際には評価されません。これは、名前も無視され、インターフェイスのデフォルトの登録が解決されることを意味しますが、これはcheez1、ここでは使用したくないものです。

実際、ジェフ・アトウッドのラバーダック問題解決のもう1つのケースでは、私はそれを理解しました。

container.Register<IRofl>((c, p) => new DefaultRofl(container.Resolve<ICanHasCheezburger>("x2")));

トリックを行います。ただし、コンストラクター引数がさらにある場合は、すべてのcontainer.Resolve()呼び出しを明示的に指定する必要があります。スティーブン?;-)

4

1 に答える 1

1

名前付き登録を使用する場合、それらを取得する3つの方法は、そこにあるResolveオーバーロード(名前を取得)を使用するか、ResolveAllを手動で使用するか、Fooのすべての名前付き登録を提供するIEnumerableの依存関係を取得することです。

于 2012-09-13T07:38:04.347 に答える