Một ví dụ giải thích nó tốt nhất:Tại sao bộ chặn đánh chặn DynamicProxy không được gọi cho mỗi cuộc gọi phương thức ảo?
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();
}
tôi dự kiến sẽ có kết quả:
Intercepted foo
foo
Intercepted bar
bar
Thay vào đó, tôi nhận được:
Intercepted foo
foo
bar
Tại sao?
Proxy động hoạt động như thế nào? Tôi hy vọng proxy được tạo là kế thừa từ lớp được ủy quyền, tuy nhiên, có vẻ như nó sử dụng thành phần để ủy quyền từng phương thức trong giao diện proxy với việc triển khai thực tế.
Tôi đã thử với Castle DynamicProxy và cũng với một thực hiện proxy năng động cũ, từ Cramon
Vâng, đó là nhiều hay ít chính xác. –
Chà, bạn là ngôi sao nhạc rock trong vũ trụ Castle DynamicProxy :) Cảm ơn bạn đã viết hướng dẫn! (hoặc tôi nên nói, * THE * hướng dẫn;) –