Un ejemplo explica mejor:¿Por qué no se llamará el interceptor de DynamicProxy para * cada * llamada al método virtual?
public interface IA {
void foo();
void bar();
}
public class A : IA {
public virtual void foo(){
Console.Write("foo");
bar(); //call virtual method
}
public virtual void bar(){
Console.Write("bar");
}
}
public class Interceptor : IInterceptor {
public void Intercept(IInvocation invocation)
{
Console.WriteLine("Intercepted: " + invocation.Method.Name);
invocation.Proceed();
}
}
Main(){
IA a = new A();
//proxy-ing an interface, given an implementation
IA proxy = new Castle.DynamicProxy.ProxyGenerator()
.CreateInterfaceProxyWithTarget(a, new Interceptor());
proxy.foo();
}
lo que habría esperado la salida:
Intercepted foo
foo
Intercepted bar
bar
En su lugar, me sale:
Intercepted foo
foo
bar
¿Por qué?
¿Cómo funciona el proxy dinámico? Esperaba que el proxy generado fuera herede de la clase proxiada, sin embargo, parece que usa composición para delegar cada uno de los métodos en la interfaz de proxy a la implementación real.
He tratado con el castillo DynamicProxy y también con una aplicación proxy dinámico mayor, de Cramon
Sí, eso es más o menos correcto. –
Guau, eres una estrella de rock en el universo de Castle DynamicProxy :) ¡Gracias por escribir el tutorial! (o debería decir, * EL * tutorial;) –