如何在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();