我在将参数传递给Resolve方法时误解了Autofac documentation。以下是我的意思的简约示例:
https://dotnetfiddle.net/fz5eTp
public static void Main()
{
var cb = new ContainerBuilder();
cb.RegisterType<A>();
cb.Register<B>((c, p) => new B(p.TypedAs<C>()));
using (var c = cb.Build())
{
// works
c.Resolve<B>(TypedParameter.From(new C()));
// fails
c.Resolve<A>(TypedParameter.From(new C()));
}
}
public class A { public A(B b) { } }
public class B { public B(C c) { } }
public class C { }
我期待TypedParameter传递给B级。
不幸的是,Exception消息“Sequence contains no elements”表明没有传递参数。
如何将参数(仅在Resolve time中已知)传递给较低级别的构造函数?或者在此特定示例中,如何解析A时如何将C参数传递给B.
我能想到的最简单的方法是将解决过程分为两个步骤:
首先,您可以在运行时通过指定的已知B
值解析C
,将其存储在myB
参考值中:
B myB = c.Resolve<B>(TypedParameter.From(new C()));
然后将myB
值传递给A
解析器:
A myA = c.Resolve<A>(TypedParameter.From(myB));
你可以在我的GitHub(带输出)中找到一个完整的工作示例。
如果你想在解决时间上编写一行代码,你需要修改A
和B
的寄存器:
cb.Register<A>((c, p) =>
{
B myB = c.Resolve<B>(p);
return new A(myB);
});
cb.Register<B>((c, p) => {
C myC = p.Named<C>("myC");
return new B(myC);
});
然后:
A myA = c.Resolve<A>(new NamedParameter("myC", new C()));
再次,你可以在我的GitHub(带输出)中找到一个完整的工作示例。