Castle の Dynamic Proxy を使用しているときに、少し (私が思うに) 奇妙な動作に遭遇しました。
次のコードを使用します。
class Program
{
static void Main(string[] args)
{
var c = new InterceptedClass();
var i = new Interceptor();
var cp = new ProxyGenerator().CreateClassProxyWithTarget(c, i);
cp.Method1();
cp.Method2();
Console.ReadLine();
}
}
public class Interceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine(string.Format("Intercepted call to: " + invocation.Method.Name));
invocation.Proceed();
}
}
public class InterceptedClass
{
public virtual void Method1()
{
Console.WriteLine("Called Method 1");
Method2();
}
public virtual void Method2()
{
Console.WriteLine("Called Method 2");
}
}
出力が得られることを期待していました:
- 傍受された呼び出し: Method1
- 方法 1 と呼ばれる
- 傍受された呼び出し: Method2
- 方法 2 と呼ばれる
- 傍受された呼び出し: Method2
- 方法 2 と呼ばれる
しかし、私が得たものは次のとおりです。
- 傍受された呼び出し: Method1
- 方法 1 と呼ばれる
- 方法 2 と呼ばれる
- 傍受された呼び出し: Method2
- 方法 2 と呼ばれる
私が知る限り、動的プロキシは、呼び出しがクラス自体の外部から来た場合にのみメソッド呼び出しをプロキシできます。これは、Program から呼び出されたときに Method2 がインターセプトされたが、InterceptedClass 内からではなかったからです。
プロキシされたクラス内から呼び出しを行うと、プロキシを通過しなくなることはある程度理解できますが、これが予想されていたことを確認したかっただけで、そうであれば、とにかくすべての呼び出しをインターセプトする方法があるかどうかを確認したかっただけです。彼らはどこから呼ばれていますか?
ありがとう