是否有人知道缺少什么使这项测试工作? 遗憾的是,它无法开箱即用。
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());
});
}
}
答案 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());