如何在Autofac中为开放式通用注册注册一个开放的通用装饰器?

我有一个autofac处理程序的开放式通用注册,看起来像这样。

builder.RegisterAssemblyTypes(assemblies) .AsClosedTypesOf(typeof (ICommandHandler)) .AsImplementedInterfaces(); 

这工作正常,并注册所有我的处理程序,用于封闭类型。 我现在想为所有处理程序注册一个通用装饰器,例如a

 LoggingCommandHandlerDecorator 

从autofac文档来看,您需要为实现命名,因此装饰器可以是默认的ICommandHandler。 在注册开放式generics时,我不确定这是如何工作的。 我试过在开放注册中添加一个名字。

  builder.RegisterAssemblyTypes(assemblies) .AsClosedTypesOf(typeof (ICommandHandler)) .Named("commandHandler", typeof (ICommandHandler)) .AsImplementedInterfaces(); 

并注册装饰,但没有喜悦。

  builder.RegisterGenericDecorator(typeof (LoggingCommandHandlerDecorator), typeof (ICommandHandler), fromKey: "commandHandler"); 

任何帮助赞赏。

根据此处的autofac文档,请尝试以下解决方案:

 // Register the open generic with a name so the // decorator can use it. builder.RegisterGeneric(typeof(CommandHandler<>)) .Named("commandHandler", typeof(ICommandHandler<>)); // Register the generic decorator so it can wrap // the resolved named generics. builder.RegisterGenericDecorator( typeof(LoggingCommandHandlerDecorator<>), typeof(ICommandHandler<>), fromKey: "commandHandler"); 

我做了同样的事,没有工作; 然后找到解决方案。 作者: Boby Johnson – Gist

  builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .As(type => type.GetInterfaces() .Where(interfaceType => interfaceType.IsClosedTypeOf(typeof(ICommandHandler<,>))) .Select(interfaceType => new KeyedService("commandHandler", interfaceType))) .InstancePerLifetimeScope();