Autofac:在注入的对象中注入(解决困难的依赖关系)
本文关键字:注入 依赖 解决 关系 对象 Autofac | 更新日期: 2023-09-27 18:20:02
我需要将对象B和C注入A,其中对象C由B使用(所有对象都在Autofac中创建)如果B不需要使用C(对象C用于存储参数),并且我可以使用硬编码值,我可以写这样的东西:
builder.RegisterType<B>().As<IB>().WithParameter("key","value");
但是,如果参数是通过autofac创建的,我该怎么办?
builder.RegisterType<B>().As<IB>().WithParameter("key",C.value);
我相信这就是您想要的
class B
{
public B(string key, C anotherDependency)
{
this.Key = key;
}
public string Key { get; private set; }
}
class C
{
public string Value { get { return "C.Value"; } }
}
[TestMethod]
public void test()
{
var cb = new ContainerBuilder();
cb.RegisterType<B>().WithParameter(
(prop, context) => prop.Name == "key",
(prop, context) => context.Resolve<C>().Value);
cb.RegisterType<C>();
var b = cb.Build().Resolve<B>();
Assert.AreEqual("C.Value", b.Key);
}
你可能想考虑的另一种方式是这个
class B
{
public B(string key) { ... }
public B(C c) : this(c.Value) { }
}
这意味着你不需要在组合根中有任何特殊的东西——Autofac会自动选择第二个构造函数(假设C
已注册,而string
未注册)。