c# - Autofac 参数注入
问题描述
我误解了关于将参数传递给 Resolve 方法的Autofac 文档。以下是我的意思的简约示例:
例子
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 类。
不幸的是,异常消息“序列不包含元素”表明没有传递任何参数。
问题
如何将参数(仅在 Resolve 时知道)传递给较低级别的构造函数?或者在这个特定示例中,在解析A时,如何将C参数传递给B。
解决方案
选项1
我能想到的最简单的方法是将解析过程分为两个步骤:
B
首先,您可以在运行时通过指定的已知值解析C
,将其存储在myB
参考值中:
B myB = c.Resolve<B>(TypedParameter.From(new C()));
然后将myB
值传递给A
解析器:
A myA = c.Resolve<A>(TypedParameter.From(myB));
您可以在我的GitHub中找到完整的工作示例(带输出)。
选项2
如果您想在解析时编写一行代码,则需要修改以下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中找到一个完整的工作示例(带有输出)。
推荐阅读
- reactjs - 在 Facebook 评论中反应使用
- c# - 等到协程完成后再启动另一个协程 [Unity C#]
- arrays - Angular ngfor ,只显示一条记录
- android - 添加firestore后错误无法访问zza
- java - 带有新的初始化类变量的 Mockito InjectMocks
- python - tf.argmax() 用于多个索引 Tensorflow
- ios - 当用户未连接到互联网时,如何禁用所有 UIViewControllers 的用户交互?
- android - Android Studio Kotlin 自动完成符号
- tomcat7 - java.lang.OutOfMemoryError: 在 Spring Data MongoDB 中 MongoTemplate.save(Object objectToSave) 时出现 PermGen 空间错误
- java - 如何使用 ModelMapper 进行深度继承对象?