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

时间:2013-06-26 13:21:12

标签: c# ioc-container autofac

我需要将对象B和C注入A,其中对象C由B使用(所有对象都在Autofac中创建)如果不需要B使用C(对象C用于存储参数)和I可以使用硬编码的值,我可以写这样的东西:

     builder.RegisterType<B>().As<IB>().WithParameter("key","value");

但是,如果通过autofac创建参数,我该怎么办?

     builder.RegisterType<B>().As<IB>().WithParameter("key",C.value);

1 个答案:

答案 0 :(得分:0)

我相信这就是你要找的东西

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