基于多个构造函数解析Autofac工厂

时间:2013-03-08 16:25:00

标签: autofac

是否有人知道缺少什么使这项测试工作? 遗憾的是,它无法开箱即用。

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());
        });
    }
}

1 个答案:

答案 0 :(得分:1)

Autofac不支持此功能。

您只能在调用Resolve时传递直接依赖关系。因此,您无法在层次结构链的内部特定地指定依赖关系。

无论如何,这违反了控制原则的反转:C应该只知道B并且不应该知道A使用B的地方。因此,当您要求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());