9

tôi đã viết một ví dụ như thế nàyCách sử dụng IInterceptor trong Castle.DynamicProxy?

Simple lớp Calculator:

public class Calculator 
{ 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

thực hiện "IInterceptor" được cung cấp bởi DynamicProxy

[Serializable] 
public abstract class Interceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     ExecuteBefore(invocation); 
     invocation.Proceed(); 
     ExecuteAfter(invocation); 

    } 
    protected abstract void ExecuteAfter(IInvocation invocation); 
    protected abstract void ExecuteBefore(IInvocation invocation); 
} 

Tạo một lớp Interceptor và thừa hưởng từ "Interceptor" lớp

public class CalculatorInterceptor : Interceptor 
{ 
    protected override void ExecuteBefore(Castle.DynamicProxy.IInvocation invocation) 
    { 
     Console.WriteLine("Start"); 
    } 

    protected override void ExecuteAfter(Castle.DynamicProxy.IInvocation invocation) 
    { 
     Console.WriteLine("End"); 
    } 
} 

nhưng khi tôi sử dụng nó KHÔNG hoạt động !!!

static void Main(string[] args) 
    { 
     ProxyGenerator generator = new ProxyGenerator(); 
     Calculator c = generator.CreateClassProxy<Calculator>(new CalculatorInterceptor()); 
     var r = c.Add(11, 22); 
     Console.WriteLine(r); 
     Console.ReadKey(); 
    } 

tôi trừ để xem một cái gì đó như thế này:

START 
33 
END 

nhưng chỉ hiển thị

33 

Làm thế nào tôi có thể sửa chữa nó?!

Trả lời

11

Hãy thử tạo phương thức Add ảo.

public class Calculator 
{ 
    public virtual int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

Trình tạo proxy tạo lớp mới kế thừa Calculator. Do đó, phương pháp Add bị ghi đè để thực hiện việc chặn.

+0

vâng, có vẻ ok nhưng câu hỏi là kết quả là START END 33 cách tôi có thể đặt Trước & Sau theo cách chính xác và xem kết quả như thế này START 33 END, Tôi có thể sửa lỗi này trong lớp Interceptor cho các phương thức đúng không? – user3153878

+1

@ user3153878 trình chặn thực thi ngay trước và sau khi gọi 'Add', nhưng bạn ghi kết quả sau đó vào bàn điều khiển (thực thi trước -> thi hành Add -> execute after -> write result). Nếu bạn tạo bảng điều khiển gọi trong phương thức 'Add', bạn sẽ nhận được kết quả mong muốn. –

0

Bạn phải sử dụng quá tải chính xác và vượt qua trong cả đối tượng đích và trình chặn mà bạn muốn sử dụng. Phương pháp sẽ trông giống như sau:

var proxy = generator.CreateClassProxy<Calculator>(new Calculator(), new CalculatorInterceptor()); 
+0

không, tôi không quá tải, bạn đã sai! :( – user3153878

1

Các tùy chọn khác là để thực hiện một giao diện ICalculator

public interface ICalculator 
{ 
    int Add(int a, int b); 
} 

và kế thừa lớp học của bạn từ giao diện này

public class Calculator : ICalculator 
{ 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

proxy năng động của bạn sau đó sẽ sử dụng CreateInterfaceProxyWithTarget phương pháp

var proxyGenerator = new ProxyGenerator(); 

ICalculator calculator = new Calculator() 

var proxy = proxyGenerator.CreateInterfaceProxyWithTarget(
    calculator, 
    ProxyGenerationOptions.Default, 
    new CalculatorInterceptor()); 

Console.WriteLine(proxy.Add(1, 2)); 

Điều này được loại bỏ ảo từ lớp Máy tính của bạn, theo ý kiến ​​của tôi là thiết kế xấu, trừ khi bạn có lý do để ghi đè phương thức trong tương lai.

Các vấn đề liên quan