Autofac применяет универсальный декоратор для закрытых типов, которые не могут работать

Используя 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 - регистрация декоратора для некоторых открытых Generic, но ни одна из них не работает для меня.

1 ответ

Вы передаете открытый универсальный тип KeyedService, Вместо этого вы должны передать закрытый универсальный тип следующим образом:

builder
    .RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .As(type => type.GetInterfaces()
        .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>)))
        .Select(t => new KeyedService("requestHandler", t)))
    .InstancePerLifetimeScope();
Другие вопросы по тегам