我需要将对象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);
答案 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
未注册)。