【问题标题】:Autofac applying generic decorator on closed types unable to get workingAutofac 在封闭类型上应用通用装饰器无法正常工作
【发布时间】: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 尝试了几种方法,但没有一个对我有用。

【问题讨论】:

    标签: c# autofac mediatr


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢史蒂文,这将使它确实有效。我已经看到,如果你想使用装饰器,你必须以不同的方式注册你的类型,而不是不注册。如果这样做,请使用您的解决方案,如果不这样做,则只需使用类似:builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsClosedTypesOf(typeof(IRequestHandler)).AsImplementedInterfaces();
    • 另请注意,overload of AsClosedTypesOf accepting a serviceKey 存在,无需手动检查类型是否关闭了开放的通用接口
    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 2019-05-17
    • 2021-01-06
    • 2021-06-30
    • 2013-09-30
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多