Как зарегистрировать открытый универсальный декоратор для открытой универсальной регистрации в 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();
Другие вопросы по тегам