gpt4 book ai didi

c# - Autofac 参数注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 12:04:01 24 4
gpt4 key购买 nike

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

例子

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

最佳答案

选项1

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

首先,您可以在运行时通过指定的已知C 值解析B,将其存储在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 中找到完整的工作示例(带输出)。

关于c# - Autofac 参数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55933717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com