Я столкнулся с каким-то странным поведением при использовании 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
Насколько я могу судить, динамический прокси-сервер может использовать только вызовы метода прокси, если вызов поступает из-за пределов самого класса, поскольку Method2 был перехвачен при вызове из программы, но не из InterceptedClass.
Я могу понять, что при совершении звонков из прокси-класса он больше не будет пропускать прокси-сервер, а просто хочет проверить, что это ожидалось, и если он тогда видит, есть ли там все равно, чтобы получить все вызовы перехвачены независимо от того, откуда они вызваны?
Спасибо