Autofac参数注入

问题描述 投票:2回答:1

我在将参数传递给Resolve方法时误解了Autofac documentation。以下是我的意思的简约示例:

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级。

不幸的是,Exception消息“Sequence contains no elements”表明没有传递参数。

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

c# dependency-injection inversion-of-control autofac
1个回答
1
投票

选项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

如果你想在解决时间上编写一行代码,你需要修改AB的寄存器:

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(带输出)中找到一个完整的工作示例。

© www.soinside.com 2019 - 2024. All rights reserved.