0

使用 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 修饰。我不知道我在这里缺少什么,根据如何在 Autofac 中为开放的通用注册注册一个开放的通用装饰器尝试了几种方法?AutoFac - 为一些开放的泛型注册装饰器,但对我没有用。

4

1 回答 1

3

您正在将开放通用类型传递给KeyedService. 您应该改为传递封闭的泛型类型,如下所示:

builder
    .RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .As(type => type.GetInterfaces()
        .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
        .Select(t => new KeyedService("requestHandler", t)))
    .InstancePerLifetimeScope();
于 2016-10-05T08:33:25.423 回答