自动对无法工作的封闭类型应用泛型装饰器

本文关键字:应用 类型 泛型 工作 | 更新日期: 2023-09-27 18:11:35

使用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 -注册一个装饰器为一些开放的通用,但没有一个为我工作。

自动对无法工作的封闭类型应用泛型装饰器

您正在将开放泛型类型传递给KeyedService。相反,您应该传递闭泛型类型,如下所示:

builder
    .RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .As(type => type.GetInterfaces()
        .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
        .Select(t => new KeyedService("requestHandler", t)))
    .InstancePerLifetimeScope();
相关文章: