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应该只知道B并且不应该知道某处 anAB. 因此,当您要求 a 时,C您也不应该告诉A使用哪个。

但是,您可以通过手动构建解析链来实现类似的效果:

这是你能得到的最接近的:

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 回答