2

このテストを機能させるために何が欠けているか知っている人はいますか?箱から出してすぐに機能しないのは残念です。

class A { }

class B { public B(A a) { } }

class C { public C(B b) { } }

[Test]
public void SuperFactoryResolutionTest()
{
    var builder = new ContainerBuilder();            
    builder.RegisterType<B>();
    builder.RegisterType<C>();

    using (var container = builder.Build())
    {
        Assert.DoesNotThrow(() =>
        {
            var factory = container.Resolve<Func<A, C>>();
            var x = factory(new A());
        });
    }
}
4

1 に答える 1

1

いいえ、これはAutofacではサポートされていません。

を呼び出す場合にのみ、直接の依存関係を渡すことができますResolve。したがって、階層チェーンの奥深くで依存関係をアドホックに指定することはできません。

とにかく、これは制御の反転の原則に反します。どこかでが使用されていることCだけを知っているべきであり、知っているべきではありません。したがって、あなたがあなたに尋ねるとき、あなたはまたどちらを使うべきかを言うべきではありません。BABCA

ただし、解決チェーンを手動で構築することで、ある程度類似した結果を得ることができます。

これはあなたが得ることができるものに最も近いです:

var intermediateFactory = container.Resolve<Func<B,C>>();
Func<A, C> factory = 
    a => intermediateFactory(container.Resolve<B>(TypedParameter.From(a)));
var x = factory(new A());
于 2013-03-08T19:39:42.520 に答える