Следуя моему предыдущему вопросу о 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, за которым следует исключение).
Есть ли способ достичь этого?