1

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

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

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

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

1 回答 1

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

于 2013-06-26T14:18:17.513 回答