【发布时间】:2016-10-04 20:32:21
【问题描述】:
使用 Autofac 3.5 和 MediatR,我正在尝试将装饰器应用于实现特定接口的封闭类型。我有以下处理程序类型:
class ABCQueryHandler: IRequestHandler<GetBankStatementLinesQuery, BankStatementLine>
我想将以下通用开放装饰器类型应用于所有实现 IRequestHandler 的类型:
class LoggingHandler<TRequest, TResponse> : IRequestHandler<TRequest, TResponse>
where TRequest : IRequest<TResponse>
我的 Autofac 配置是:
builder
.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.As(type => type.GetInterfaces()
.Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
.Select(t => new KeyedService("requestHandler", typeof(IRequestHandler<,>))))
.InstancePerLifetimeScope();
builder.RegisterGenericDecorator(typeof(LoggingHandler<,>), typeof(IRequestHandler<,>), fromKey: "requestHandler")
.InstancePerLifetimeScope();
封闭类型被注入,但从未用 LoggingHandler 修饰。我不知道我在这里缺少什么,按照How to register an open generic decorator for an open generic registration in Autofac? 或AutoFac - Registering a decorator for some of an open Generic 尝试了几种方法,但没有一个对我有用。
【问题讨论】: