AutoFac RegisterGenericDecorator не работает с декоратором, имеющим ограничение типа

У меня есть общий обработчик команд со многими конкретными реализациями.

public interface ICommandHandler<TCommand>

У меня есть декоратор с ограничением типа, который я хочу использовать для нескольких, но не для всех, реализаций ICommandHandler.

    public class AddNoteCommandHandlerDecorator<TCommand> 
    : ICommandHandler<TCommand> where TCommand : INoteCommand
{
    private readonly ICommandHandler<TCommand> decorated;

    public AddNoteCommandHandlerDecorator(ICommandHandler<TCommand> decorated)
    {
        this.decorated = decorated;
    }

    public void Handle(TCommand command)
    ...

Я пытаюсь зарегистрироваться в AutoFac следующим образом:

        public static void Register(HttpConfiguration config)
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly);

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        builder.RegisterAssemblyTypes(assemblies)
            .As(t => t.GetInterfaces()
            .Where(a => a.IsClosedTypeOf(typeof(ICommandHandler<>)))
            .Select(a => new KeyedService("commandHandler", a)));

        builder.RegisterGenericDecorator(
             typeof(AddNoteCommandHandlerDecorator<>),
             typeof(ICommandHandler<>),
             fromKey: "commandHandler");

        var container = builder.Build();

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        config.DependencyResolver = new AutoFacContainer(new AutofacDependencyResolver(container));
    }

Однако когда для команды, реализующей INoteCommand, вызывается конкретный обработчик команд, декоратор не работает.

Я неправильно настроил регистрацию в AutoFac? Или я что-то еще пропустил?


person greg    schedule 25.02.2015    source источник
comment
Вы ничего не неправильно настроили. Autofac не поддерживает это из коробки.   -  person Steven    schedule 26.02.2015
comment
Спасибо, Стивен. Глядя на некоторые из ваших сообщений, есть ли у SimpleInjector такая возможность? если нет, можете ли вы предложить лучший подход?   -  person greg    schedule 27.02.2015
comment
Да, Simple Injector делает это из коробки. Ничего особенного тебе не нужно делать. Просто зарегистрируйте декоратор; он будет применен условно автоматически.   -  person Steven    schedule 27.02.2015
comment
Отличные новости! Я перейду на SimpleInjector.   -  person greg    schedule 02.03.2015
comment
это было бы полезно для вас weblogs.asp.net/ сиджуваргезе/   -  person Ehsan    schedule 24.06.2015