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

Autofac:在注入的对象中注入(解决困难的依赖关系)

我相信这就是您想要的

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未注册)。