Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Autofac中,如何用装饰器替换默认注册?_C#_Autofac - Fatal编程技术网

C# 在Autofac中,如何用装饰器替换默认注册?

C# 在Autofac中,如何用装饰器替换默认注册?,c#,autofac,C#,Autofac,我在Autofac(v4.4.0、.NET4.6.1)中遇到了一些意想不到的行为,我觉得这可能是一个bug 从: 默认注册 如果多个组件公开同一服务,Autofac将使用最后注册的组件作为该服务的默认提供程序: e、 g.如果我这样做: builder.RegisterType<FooOne>().As<IFoo>(); // Next line replaces default IFoo implementation builder.Regist

我在Autofac(v4.4.0、.NET4.6.1)中遇到了一些意想不到的行为,我觉得这可能是一个bug

从:

默认注册 如果多个组件公开同一服务,Autofac将使用最后注册的组件作为该服务的默认提供程序

e、 g.如果我这样做:

    builder.RegisterType<FooOne>().As<IFoo>();
    // Next line replaces default IFoo implementation
    builder.RegisterType<FooTwo>().As<IFoo>();
IFoo
解析为未装饰的
FooOne
。我觉得这不一致;违反法律的行为

您可能会说我根本不应该使用第(1)行(没有它代码也可以正常工作),但使用插件替换注册是一种公认的习惯用法(例如)

在我的例子中,这个bug存在于一个相当大的代码库中,在这个代码库中,包装的类型已经通过一个约定注册,现在需要进行修饰,需要重新思考如何注册

适用于LINQPad演示该问题的要点如下


我所忽略的观察到的行为是否有任何设计原因?有没有办法让decorator注册替换默认值?

您可以看到关于您的问题的公开问题。在这里的讨论中,你可以找到这种行为背后的原因。据我所知,他们正试图解决这个问题,但事实证明,由于autofac的内部工作,这并不是一件小事

同时,作为一种解决方法,您可以像这样注册您的装饰师:

builder.Register((cnt, parameters) => new DecoratorFoo(cnt.ResolveNamed<IFoo>("foo", parameters))).As<IFoo>();
builder.Register((cnt,parameters)=>newdecorfoo(cnt.ResolveNamed(“foo,parameters))).As();
这还将修复另一个问题\bug(在本文中提到),您以后可能会遇到(或不会遇到),这与decorator不会将参数向前传播到装饰对象这一事实有关

builder.Register((cnt, parameters) => new DecoratorFoo(cnt.ResolveNamed<IFoo>("foo", parameters))).As<IFoo>();