C# Castle Windsor:通过拦截将两个接口注册为一个单例

C# Castle Windsor:通过拦截将两个接口注册为一个单例,c#,castle-windsor,castle,C#,Castle Windsor,Castle,在我之前提出的关于Unity()的问题之后,我尝试对Castle Windsor做同样的事情: 我有一个实现两个接口的类,我想对该类的方法应用拦截。我正在使用转发类型来执行此操作,并产生了以下代码: public interface I1 { void Method1(); } public interface I2 { void Method2(); } public class C : I1, I2 { public void Method1() {} p

在我之前提出的关于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();
}
删除“.Interceptors”行会导致代码运行没有问题(但当然不会调用我的拦截代码)。如果我删除“.Interceptors”行,而用“[Interceptor(typeof(LogInterceptor))]”来修饰C类,我将得到与上面相同的输出(即进入/离开方法2,然后是异常)


有办法做到这一点吗?

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

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();

我希望我明白你的意思。我尝试使用:

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();

我发现的最新一个:2.5.3。这很奇怪。你的代码看起来不错,我认为应该可以用。我稍后会在家里调查,如果您也将该类添加为服务会怎么样?您可能必须将其指定为第一个,这样才能工作我发现的最新版本:2.5.3。这很奇怪。你的代码看起来不错,我认为应该可以用。我稍后会在家里调查,如果您也将该类添加为服务会怎么样?您可能必须将其指定为第一个,才能使其工作
Method2 0
Method1 2