Как зарегистрировать открытый универсальный декоратор для открытой универсальной регистрации в Autofac?
У меня есть открытая общая регистрация для обработчиков в autofac, которая выглядит следующим образом.
builder.RegisterAssemblyTypes(assemblies)
.AsClosedTypesOf(typeof (ICommandHandler<>))
.AsImplementedInterfaces();
Это прекрасно работает и регистрирует все мои обработчики для закрытых типов. Теперь я хочу зарегистрировать универсальный декоратор для всех обработчиков, например
LoggingCommandHandlerDecorator<>
Из документации autofac вы должны назвать свою реализацию, чтобы декоратор мог быть по умолчанию ICommandHandler. Я не уверен, как это работает, когда вы регистрируете открытые дженерики. Я попытался добавить имя к открытой регистрации.
builder.RegisterAssemblyTypes(assemblies)
.AsClosedTypesOf(typeof (ICommandHandler<>))
.Named("commandHandler", typeof (ICommandHandler<>))
.AsImplementedInterfaces();
И оформление декоратора но радости нет.
builder.RegisterGenericDecorator(typeof (LoggingCommandHandlerDecorator<>), typeof (ICommandHandler<>),
fromKey: "commandHandler");
Любая помощь приветствуется.
2 ответа
Решение
В соответствии с autofac
документация здесь, пожалуйста попробуйте следующее решение:
// Register the open generic with a name so the
// decorator can use it.
builder.RegisterGeneric(typeof(CommandHandler<>))
.Named("commandHandler", typeof(ICommandHandler<>));
// Register the generic decorator so it can wrap
// the resolved named generics.
builder.RegisterGenericDecorator(
typeof(LoggingCommandHandlerDecorator<>),
typeof(ICommandHandler<>),
fromKey: "commandHandler");
Я сделал то же самое, что и ты, и не работал; затем нашел решение ниже. Боби Джонсон - Гист
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.As(type => type.GetInterfaces()
.Where(interfaceType => interfaceType.IsClosedTypeOf(typeof(ICommandHandler<,>)))
.Select(interfaceType => new KeyedService("commandHandler", interfaceType)))
.InstancePerLifetimeScope();