例はそれを最もよく説明します:
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
なんで?
動的プロキシはどのように機能しますか?生成されたプロキシがプロキシされたクラスから継承することを期待していましたが、 compositionを使用して、プロキシされたインターフェイスの各メソッドを実際の実装に委任しているようです。
Castle DynamicProxyと、Cramonの古い動的プロキシ実装を試してみました