Замок Виндзорский перехватчик

Я пытаюсь перехватить вызовы метода Handle в моих обработчиках команд. этот процесс работает нормально, когда я явно регистрирую каждый обработчик команд, проблема в том, что моя общая регистрация обработчиков команд и перехватчика неверна.

исключение:

Исключение типа «Castle.MicroKernel.ComponentActivator.ComponentActivatorException» произошло в Castle.Windsor.dll, но не было обработано в коде пользователя

Дополнительная информация: ComponentActivator: не удалось прокси TempSearch.Command.Data.CommandHandlers.AddTempsJobCommandHandler

Похоже, что он не может найти перехватчик, поскольку он говорит, что некоторые компоненты неправильно настроены:

"Некоторые зависимости этого компонента не могут быть разрешены статически. \ R \ n'TempSearch.Command.Data.CommandHandlers.AddTempsCandidateAvailabilityCommandHandler 'ожидает следующих зависимостей: \ r \ n- Компонент' TempSearch.Ioc.ExceptionHandlingInridecept over ( ), который не был найден. Вы забыли зарегистрировать его или неправильно написали имя? Если компонент зарегистрирован, а переопределение выполняется с помощью типа, убедитесь, что ему не назначено имя не по умолчанию, или переопределите зависимость с помощью имени. \ r \ п»

Интерфейс:

public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

Пример обработчика команд:

public class AddTempsCandidateAvailabilityCommandHandler 
    : ICommandHandler<TempsCandidateAvailability>
{
    private readonly IDbConnection connection;

    public AddTempsCandidateAvailabilityCommandHandler(
        IDbConnection connection)
    {
        this.connection = connection;
    }

    public void Handle(TempsCandidateAvailability command)
    {
        // ...
    }
}

регистрация:

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.Register(
        Component.For<IDbConnection>()
            .UsingFactoryMethod(() => ConnectionHelper.GetOpenDbConnection(
                Connection.DatabaseName.ReedOnline))
            .LifestylePerWebRequest());

    container.Register(
        Classes
            .FromAssemblyContaining<EcruiterCommands>()
            .Where(t => t.Name.EndsWith("Commands"))
            .WithService
            .AllInterfaces().LifestylePerWebRequest());

    container.Register(
        Classes
            .FromAssemblyContaining<EcruiterCommands>()
            .Where(t => t.Name.EndsWith("CommandHandler"))
            .WithService.AllInterfaces()
            .LifestylePerWebRequest()
            .Configure(c => c.Interceptors<ExceptionHandlingIntercepter>()
                .LifestyleTransient()));
}

перехватчик:

[Transient]
public class ExceptionHandlingIntercepter : IInterceptor
{
    private static readonly MethodInfo Execute = 
        typeof(ICommandHandler<>).GetMethod("Handle");

    private readonly IKernel kernel;

    public ExceptionHandlingIntercepter(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public void Intercept(IInvocation invocation)
    {
        if (invocation.Method != Execute)
        {
            invocation.Proceed();
            return;
        }

        try
        {
            invocation.Proceed();
        }
        finally
        {
            kernel.ReleaseComponent(invocation.Proxy);
        }
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос