Un esempio lo spiega meglio:Perché l'intercettatore di DynamicProxy non viene chiamato per * ciascuna * chiamata al metodo virtuale?
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();
}
mi sarei aspettato l'uscita:
Intercepted foo
foo
Intercepted bar
bar
Invece, ottengo:
Intercepted foo
foo
bar
Perché?
Come funziona il proxy dinamico? Mi aspettavo che il proxy generato a ereditasse dalla classe proxy, tuttavia, sembra che utilizzi la composizione per delegare ciascuno dei metodi nell'interfaccia con proxy all'attuazione effettiva.
Ho provato con il Castello DynamicProxy ed anche con un'implementazione di proxy dinamica più anziani, da Cramon
Sì, questo è più o meno corretto. –
Wow, sei una rockstar nell'universo di Castle DynamicProxy :) Grazie per aver scritto il tutorial! (o dovrei dire, * IL * tutorial;) –