Castle Windsor: зарегистрируйте два интерфейса как один синглтон с перехватом - PullRequest
2 голосов
/ 20 марта 2011

Следуя моему предыдущему вопросу о Unity ( Unity: зарегистрируйте два интерфейса как один синглтон с перехватом ), я попытался сделать то же самое с Castle Windsor:

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

public interface I1
{
    void Method1();
}

public interface I2
{
    void Method2();
}

public class C : I1, I2
{
    public void Method1() {}
    public void Method2() {}
}

public class LogInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("Entering " + invocation.Method.Name);
        invocation.Proceed();
        Console.WriteLine("Leaving " + invocation.Method.Name);
    }
}

public static void CastleWindsorTest()
{
    var container = new WindsorContainer();
    container.Register(
        Component.For<LogInterceptor>(),
        Component.For<I2, I1>().ImplementedBy<C>()
            .Interceptors(new InterceptorReference(typeof(LogInterceptor))).First
        );

    container.Resolve<I2>().Method2();
    container.Resolve<I1>().Method1();
}

Приведенный выше код приводит к следующему выводу:

Entering Method2
Leaving Method2

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'Castle.Proxies.I2Proxy' to type 'I1'.
at Castle.Windsor.WindsorContainer.Resolve[T]() in e:\OSS.Code\Castle.Windsor\src\Castle.Windsor\Windsor\WindsorContainer.cs:line 872
at BlahMain.Program.CastleWindsorTest()
at BlahMain.Program.Main(String[] args)

Удаление ".Interceptorsmsgstr "строка вызывает выполнение кода без проблем (но, конечно, мой код перехвата не вызывается).Если я удаляю строку «.Interceptors» и вместо этого украшаю класс C «[Interceptor (typeof (LogInterceptor)))]», я получаю тот же вывод, что и выше (т. Е. Метод входа / выхода2, за которым следует исключение).

Есть ли способ достичь этого?

1 Ответ

0 голосов
/ 22 марта 2011

Надеюсь, я понял, что вы имели в виду. Я пытался использовать:

var container = new WindsorContainer();
    container.Register(
        Component.For<LogInterceptor>(),
        Component.For<C, I2, I1>().ImplementedBy<C>()
            .Interceptors(new InterceptorReference(typeof(LogInterceptor))).First
        );

    container.Resolve<I2>().Method2();
    container.Resolve<I1>().Method1();

Теперь приложение не аварийно завершает работу, но мой код регистрации не вызывается. Вывод, который я получаю:

Method2 0
Method1 2
...