2

Unity に関する以前の質問 ( Unity: Register two interfaces as one singleton with interrupting ) に続いて、Castle Windsor で同じことを試みました。

2 つのインターフェイスを実装するクラスがあり、クラスのメソッドにインターセプトを適用したいと考えています。私はこれを行うために転送された型を使用しており、次のコードを考え出しました:

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" 行を削除し、代わりにクラス C を "[Interceptor(typeof(LogInterceptor))]" で装飾すると、上記と同じ出力が得られます (つまり、メソッド 2 の開始/終了、その後に例外が続きます)。

これを達成する方法はありますか?

4

1 に答える 1

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
于 2011-03-22T06:09:24.493 に答える