次のコンストラクター署名で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()呼び出しを明示的に指定する必要があります。スティーブン?;-)