2012-11-03 58 views
13

Tôi có nhiều phương thức riêng lẻ cần thực hiện các chức năng tương tự trước khi tiếp tục thực hiện riêng. Bây giờ tôi có thể thực hiện các chức năng này trong mỗi phương pháp, nhưng tôi đã tự hỏi nếu có một cách để khai thác attributes để làm điều này? Như một ví dụ rất đơn giản, tất cả các cuộc gọi mạng phải kiểm tra kết nối mạng.Sử dụng các thuộc tính để gọi các phương thức

public void GetPage(string url) 
{ 
    if(IsNetworkConnected()) 
     ... 
    else 
     ...   
} 

Phương pháp này sẽ hoạt động nhưng tôi phải gọi phương thức IsNetworkConnected cho mỗi phương pháp sử dụng mạng và xử lý riêng từng phương pháp. Thay vào đó, tôi muốn làm điều này

[NetworkCall] 
public void GetPage(string url) 
{ 
    ... 
} 

Nếu mạng không có sẵn, một phương pháp được gọi là lỗi thay vào đó và GetPage bị bỏ qua, nếu không GetPage được gọi.

Điều này nghe có vẻ rất giống với Lập trình định hướng khía cạnh, nhưng tôi không muốn triển khai toàn bộ khuôn khổ cho một vài cuộc gọi. Đây là một bài tập học tập nhiều hơn là một bài tập thực hiện, vì vậy tôi đã tò mò muốn làm thế nào một cái gì đó như thế này sẽ được thực hiện tốt nhất.

+0

Còn thừa kế thì sao?Làm cho tất cả chúng bắt nguồn từ một lớp "Mạng" cơ bản hoặc một cái gì đó giống như nó. – gdoron

Trả lời

3

Bạn có thể sử dụng PostSharp, nó là khuôn khổ khía cạnh định hướng cho .NET, có vẻ như quite easy to use:

static void Main(string[] args) 
{ 
    Foo(); 
} 

[IgnoreMethod(IsIgnored=true)] 
public static void Foo() 
{ 
    Console.WriteLine("Executing Foo()..."); 
} 

[Serializable] 
public class IgnoreMethodAttribute : PostSharp.Aspects.MethodInterceptionAspect 
{ 
    public bool IsIgnored { get; set; } 

    public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args) 
    { 
     if (IsIgnored) 
     { 
      return; 
     } 

     base.OnInvoke(args); 
    } 
} 

khía cạnh Phương pháp cấp tính năng có sẵn trong các phiên bản miễn phí : http://www.sharpcrafters.com/purchase/compare

Hiệu suất thời gian chạy:

Vì PostSh arp là một công nghệ biên dịch, hầu hết các công việc tốn kém được thực hiện tại thời gian xây dựng, để các ứng dụng bắt đầu nhanh chóng và thực thi nhanh. Khi tạo mã, PostSharp nhận giả định rằng việc gọi một phương thức ảo hoặc nhận một trường tĩnh là một hoạt động tốn kém. Trái ngược với tin đồn, PostSharp không sử dụng System.Reflection khi chạy. http://www.sharpcrafters.com/postsharp/performance

+0

Tôi nghĩ PostSharp sẽ không hiệu quả bởi vì nó phải trải qua một lớp phản chiếu ... nhưng nó * âm thanh * giống như hầu hết mọi thứ trong thời gian biên dịch. API đẹp, sạch sẽ. Tôi có thể thử cho một số dự án của tôi. – mpen

+0

Có, vừa đọc trên trang web của họ: '" Trái ngược với tin đồn, PostSharp không sử dụng System.Reflection tại thời gian chạy. "' http://www.sharpcrafters.com/postsharp/performance Vì vậy, hiệu suất doesn ' t dường như là một vấn đề. – maximpa

+0

Cảm ơn, tôi sẽ xem xét PostSharp. Tôi không đặc biệt muốn sử dụng một khuôn khổ, nhưng dường như không có sự thay thế. – keyboardP

1

Tôi không nghĩ rằng bạn có thể làm điều này với chỉ attributes, bởi vì chúng không được thực thi bởi thời gian chạy nếu bạn không chủ động làm gì đó với chúng. Một cách tiếp cận nhẹ sẽ là Ninject with Interceptions extension, đó là một khung công tác, nhưng là một khung rất mỏng và bạn có thể đã sử dụng DI cho dù sao đi nữa.

Một tùy chọn khác, nhưng có liên quan nhiều hơn một chút, có thể dựa trên MEF và sau đó bạn có thể sử dụng thuộc tính và thực hiện điều gì đó trong khi kích hoạt.

1

Bạn nói đúng, có vẻ như AOP.
Điều gì sau âm thanh như thời gian biên dịch? I E. thuộc tính được biến thành mã bổ sung bởi trình biên dịch.
Bạn có thể xem làm thế nào để thực hiện điều này ...
Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving
tất cả tham khảo các công cụ và kỹ thuật để thực hiện điều này.

Hoặc bạn có thể sử dụng khung công tác AOP. IMHO, bạn nên xem xét các khuôn khổ AOP.

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