Castle Windsor:将两个接口注册为一个单独的拦截器

时间:2011-03-20 13:40:50

标签: c# castle-windsor castle

按照我之前关于Unity的问题(​​Unity: Register two interfaces as one singleton with interception),我试图对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)

删除“.Interceptors”行会导致代码无问题地运行(但当然不会调用我的拦截代码)。如果我删除“.Interceptors”行而不是使用“[Interceptor(typeof(LogInterceptor))]”装饰类C,我得到与上面相同的输出(即输入/离开方法2,然后是异常)。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

我希望我理解你的意思。我试着用:

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