C# Autofac装饰器+;代理工厂
我试图在Autofac中使用一个decorator和一个代理工厂,但我似乎无法让它解析参数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
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();
几乎相同数量的代码,但工作正常,因为您需要手动传播参数