Проблемы с созданием перехватчика Castle.Windsor

Хорошо, я официально схожу с ума по этому поводу...

Я пытаюсь создать перехватчик Castle.Windsor, но разрешение из контейнера продолжает выдавать это исключение:

DependencyResolverException: An interceptor registered for 
DI_Test.DatabaseService doesn't implement the IInterceptor interface

Насколько я вижу, я сделал все по книге, и содержимое контейнера (в режиме отладки) не сообщает о каких-либо неправильно настроенных сервисах.

Конфигурация контейнера:

public class ControllersInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container
            .Register(Component.For<Runner>())
            .Register(Component.For<IDataDependency>()
                .ImplementedBy<DatabaseService>()
                .LifestyleSingleton()
                .Interceptors(InterceptorReference.ForKey("wait")).Anywhere)
            .Register(Component.For<WaitAndRetryInterceptor>().LifeStyle.Singleton
                .Named("wait"))
            ;
    }
}

Мой перехватчик:

public class WaitAndRetryInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        //throw new NotImplementedException();
    }
}

Моя программа:

public class Runner
{
    public void Run()
    {
        _dataDependency.GetData();
    }

    public Runner(IDataDependency dataDependency)
    {
        _dataDependency = dataDependency;
    }
    private readonly IDataDependency _dataDependency;
}

public interface IDataDependency
{
    void GetData();
}

public class DatabaseService : IDataDependency
{
    public void GetData()
    {
        throw new NotImplementedException();
    }
}

Программа отлично работает без настройки перехватчика.

Я не могу понять, ПОЧЕМУ он выбрасывает это исключение. Перехватчик четко реализует интерфейс IInceptceptor... так в чем же проблема?

Спасибо:-)

1 ответ

Решение

Есть два интерфейса с именем IInterceptor

  • Castle.DynamicProxy.IInterceptor
  • Castle.Core.Interceptor.IInterceptor

Не уверен, в чем разница между ними, но чтобы заставить его работать, вы должны использовать первый.

Другие вопросы по тегам