首页 > 解决方案 > Autofac 参数注入

问题描述

我误解了关于将参数传递给 Resolve 方法的Autofac 文档。以下是我的意思的简约示例:

例子

https://dotnetfiddle.net/fz5eTp

public static void Main()
{
  var cb = new ContainerBuilder();
  cb.RegisterType<A>();
  cb.Register<B>((c, p) => new B(p.TypedAs<C>()));
  using (var c = cb.Build())
  {
    // works
    c.Resolve<B>(TypedParameter.From(new C()));
    // fails
    c.Resolve<A>(TypedParameter.From(new C()));
  }
}
public class A { public A(B b) { } }
public class B { public B(C c) { } }
public class C { }

预期的

我希望TypedParameter能够传递给 B 类。

不幸的是,异常消息“序列不包含元素”表明没有传递任何参数。

问题

如何将参数(仅在 Resolve 时知道)传递给较低级别​​的构造函数?或者在这个特定示例中,在解析A时,如何将C参数传递给B

标签: c#dependency-injectioninversion-of-controlautofac

解决方案


选项1

我能想到的最简单的方法是将解析过程分为两个步骤:

B首先,您可以在运行时通过指定的已知值解析C,将其存储在myB参考值中:

B myB = c.Resolve<B>(TypedParameter.From(new C()));

然后将myB值传递给A解析器:

A myA = c.Resolve<A>(TypedParameter.From(myB));

您可以在我的GitHub中找到完整的工作示例(带输出)。

选项2

如果您想在解析时编写一行代码,则需要修改以下A寄存器B

cb.Register<A>((c, p) =>
{
    B myB = c.Resolve<B>(p);
    return new A(myB);
});
cb.Register<B>((c, p) => {
    C myC = p.Named<C>("myC");
    return new B(myC);
});

接着:

A myA = c.Resolve<A>(new NamedParameter("myC", new C()));

同样,您可以在我的GitHub中找到一个完整的工作示例(带有输出)。


推荐阅读