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();