2013-11-23 24 views
9

Tôi có một lớp trông như thế này:thực hiện một phương pháp sau một số phương pháp chạy

public class SomeClass 
{ 
    public void SomeMethod1() { ... } 
    public void SomeMethod2() { ... } 
    public void SomeMethod3() { ... } 

    private void SomeSpecialMethod(SomeParameter) { ... } 
} 

Đối với thời điểm hiện tại, tôi có mỗi 3 phương pháp đầu tiên gọi SomeSpecialMethod() ngay trước khi những phương thức hoàn trả. Tôi sẽ thêm khoảng 15 phương pháp nữa mà cuối cùng tất cả cần phải thực hiện SomeSpecialMethod() và tôi tự hỏi nếu có cách nào để nói "khi bất kỳ phương pháp nào trong lớp này chạy, hãy thực hiện SomeSpecialMethod()" mà không cần phải rõ ràng lặp lại cuộc gọi ở cuối mỗi phương thức và tất nhiên ngăn không cho SomeSpecialMethod() tự gọi vô hạn.

Cảm ơn đề xuất của bạn.

Trả lời

4

Bạn đang tìm AOP - lập trình hướng khía cạnh.

C# không tuân theo mô hình này, nhưng bạn có thể bắt chước nó. PostSharp là một tùy chọn, nhưng tôi muốn sử dụng công cụ đánh chặn Lâu đài/DynamicProxy thay thế: http://docs.castleproject.org/Windsor.Interceptors.ashx

Bạn sẽ cần phải tạo trình chặn xung quanh đối tượng và chặn cuộc gọi đến đối tượng đó. Khi chạy, Castle sẽ làm cho máy đánh chặn này mở rộng lớp bê tông của bạn hoặc triển khai một giao diện chung - điều này có nghĩa là bạn có thể tiêm bộ chặn vào bất kỳ đoạn mã nào nhắm mục tiêu SomeClass. Mã của bạn sẽ giống như thế này:

public class Interceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed(); 
     //add your "post execution" calls on the invocation's target 
    } 
} 

Sửa

Giới thiệu về AOP với Castle: http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx

đánh chặn, và AOP nói chung, thường được sử dụng cho những thứ như đăng các kết quả của mọi lời gọi phương thức của một đối tượng, hoặc ghi lại mọi ngoại lệ được ném bởi bất kỳ phương thức nào.

Nếu logic bên trong SomeSpecialMethod là trừu tượng và không thực sự liên quan đến SomeClass (chẳng hạn như ghi nhật ký), có thể có ý nghĩa khi di chuyển logic tới chính trình chặn - nhưng điều đó tùy thuộc vào bạn.

+0

Ok, cảm ơn câu trả lời; Tôi không biết về AOP. Tôi sẽ để lại mẫu mã của tôi như bây giờ nhưng tôi sẽ giữ cho câu trả lời của bạn trong tâm trí. – frenchie

1

Tôi đã từng đối mặt với vấn đề như vậy: đã tuyên bố một lớp lồng nhau đặc biệt (ví dụ: X) mà không có bất kỳ trường/phương thức nào, chỉ với một hàm tạo đối tượng SomeClass và gọi số SomeSpecialMethod(). Sau đó thực hiện tất cả các SomeClass 's phương pháp trở về mà X:

public X SomeMethod1() { 
    ... 
    return new X(this); 
} 

Tất nhiên, có là một trên không, và bạn có thể làm điều này với void phương pháp phi (tốt, bạn có thể, nhưng nó sẽ nhận xấu xí).

+1

Ưu điểm của việc này khi gọi sự kiện là gì? Cả hai yêu cầu một dòng (miễn là bạn thêm trình xử lý trong hàm tạo). –

+0

@JeroenVannevel Tự tài liệu, tôi đoán? Lớp 'X' này có thể được đặt tên là' GuaranteedToCallSomeSpecialMethodOnReturn'. –

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