gpt4 book ai didi

c# - Autofac 装饰器 + 委托(delegate)工厂

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

我正在尝试在 Autofac 中使用装饰器和委托(delegate)工厂,但我似乎无法使用它来解析参数。

public interface IFoo
{ }

public class Foo : IFoo
{
public Foo(string bar)
{ ... }
}

public class DecoratedFoo : IFoo
{
public DecoratedFoo(IFoo decorated)
{ ... }
}

我想像这样注入(inject)服务:

public SomeService(Func<string, IFoo> factory)
{
// I would expect IFoo to be a DecoratedFoo here
IFoo foo = factory("hello");
}

我已经注册了这样的组件:

builder.RegisterType<Foo>()
.Named<IFoo>("foo")
.UsingConstructor(typeof(string));

builder.RegisterDecorator<IFoo>(
(ctx, inner) => new DecoratedFoo(inner),
fromKey: "foo");

我收到一条错误消息,提示它无法解析我的参数栏。这是一个简化的示例,但我不知道 bar 的值是多少(因此使用工厂)。

有什么方法可以完成我正在做的事情吗?

最佳答案

当您使用 RegisterDecorator - 它不会将您传递给工厂的字符串参数传播到更深的 Foo 构造函数。这是一个开放的issue关于那个。所以在这条线上

IFoo foo = factory("hello");

它会抛出异常(如您所见),因为它会尝试找到 Foo 的无参数构造函数,但没有找到。

要解决此问题,您可以删除 RegisterDecorator 并手动执行此操作:

builder.RegisterType<Foo>()
.Named<IFoo>("foo");
builder.Register((cnt, parameters) =>
new DecoratedFoo(cnt.ResolveNamed<IFoo>("foo", parameters))).As<IFoo>();

几乎相同数量的代码,但按预期工作,因为您手动传播参数。

关于c# - Autofac 装饰器 + 委托(delegate)工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141251/

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