Ein Beispiel erklärt es am besten:Warum wird der Interceptor von DynamicProxy nicht für jeden * virtuellen Methodenaufruf aufgerufen?
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();
}
Ich würde den Ausgang zu erwarten:
Intercepted foo
foo
Intercepted bar
bar
Stattdessen erhalte ich:
Intercepted foo
foo
bar
Warum?
Wie funktioniert der dynamische Proxy? Ich habe erwartet, dass der generierte Proxy von der proxied-Klasse erbt, jedoch scheint es, dass es Zusammensetzung verwendet, um jede der Methoden in der Proxy-Schnittstelle an die tatsächliche Implementierung zu delegieren.
Ich habe versucht, mit Schloss und Dynamic auch mit einer älteren dynamischen Proxy-Implementierung von Cramon
Ja, das ist mehr oder weniger korrekt. –
Wow, du bist ein Rockstar im Castle DynamicProxy Universum :) Danke für das Schreiben des Tutorials! (oder sollte ich sagen, * DAS * Tutorial;) –