C# Autofac装饰器+;代理工厂

C# Autofac装饰器+;代理工厂,c#,autofac,C#,Autofac,我试图在Autofac中使用一个decorator和一个代理工厂,但我似乎无法让它解析参数 public interface IFoo { } public class Foo : IFoo { public Foo(string bar) { ... } } public class DecoratedFoo : IFoo { public DecoratedFoo(IFoo decorated) { ... } } 我想在这样的服务中注入: public

我试图在Autofac中使用一个decorator和一个代理工厂,但我似乎无法让它解析参数

public interface IFoo
{ }

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

public class DecoratedFoo : IFoo
{
    public DecoratedFoo(IFoo decorated)
    { ... }
}
我想在这样的服务中注入:

public SomeService(Func<string, IFoo> factory)
{
    // I would expect IFoo to be a DecoratedFoo here
    IFoo foo = factory("hello");
}
public服务(Func工厂)
{
//我希望IFoo在这里是一个装饰的foo
IFoo foo=工厂(“你好”);
}
我已经注册了如下组件:

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

builder.RegisterDecorator<IFoo>(
    (ctx, inner) => new DecoratedFoo(inner),
    fromKey: "foo");
builder.RegisterType()
.命名为(“foo”)
.使用构造函数(类型(字符串));
builder.RegisterDecorator(
(ctx,内部)=>新装饰的Foo(内部),
fromKey:“foo”);
我收到一个错误,说它无法解析我的参数栏。这是一个简化的示例,但我不知道bar的值是多少(因此使用工厂)


有什么方法可以完成我所做的吗?

当您使用
RegisterDecorator
时-它不会将传递给工厂的字符串参数传播到您的
Foo
构造函数。这是一个公开的问题。所以在这条线上

IFoo foo = factory("hello");
它将抛出异常(正如您所观察到的),因为它将尝试查找
Foo
的无参数构造函数,但没有

要修复此问题,您可以删除您的
注册表记录器
,而是手动执行此操作:

builder.RegisterType<Foo>()
    .Named<IFoo>("foo");            
builder.Register((cnt, parameters) => 
    new DecoratedFoo(cnt.ResolveNamed<IFoo>("foo", parameters))).As<IFoo>();  
builder.RegisterType()
。名为“foo”);
builder.Register((cnt,参数)=>
新的DecoratedFoo(cnt.ResolveNamed(“foo”,parameters)).As();
几乎相同数量的代码,但工作正常,因为您需要手动传播参数