一個例子最能解釋它:爲什麼DynamicProxy的攔截器不會爲每個虛擬方法調用調用?
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();
}
我本來期望輸出:
Intercepted foo
foo
Intercepted bar
bar
相反,我得到:
Intercepted foo
foo
bar
爲什麼?
動態代理如何工作? 我期待生成的代理從代理類繼承,但是,它似乎使用組合將代理接口中的每個方法委託給實際實現。
我試着城堡DynamicProxy,並與舊的動態代理實現,從Cramon
是的,這或多或少是正確的。 – 2010-01-28 10:58:57
哇,你是Castle DynamicProxy宇宙中的搖滾明星:) 感謝您編寫教程! (或者我應該說,*教程;) – 2010-01-28 15:14:05