2011-10-17 23 views
5

Tôi biết với Castle Windsor, bạn có thể đăng ký các khía cạnh (khi sử dụng phương thức chặn trong Windsor là AOP) bằng cách sử dụng mã thay vì áp dụng các thuộc tính cho các lớp. Có thể tương tự trong Postsharp không? Đó là một điều ưu tiên, nhưng thích có các khía cạnh phù hợp với các giao diện/đối tượng ở một nơi, trái ngược với các thuộc tính trên tất cả.Bạn có thể áp dụng các khía cạnh trong PostSharp mà không sử dụng các thuộc tính?

Cập nhật: Tò mò nếu tôi có thể gán các khía cạnh để giao diện/đối tượng tương tự như này:

container.Register(
     Component 
     .For<IService>() 
     .ImplementedBy<Service>() 
     .Interceptors(InterceptorReference.ForType<LoggingAspect>()).Anywhere 
    ); 

Nếu bạn có thể làm điều này, bạn sẽ có tùy chọn KHÔNG phải đặt thuộc tính trên cụm/lớp/phương pháp áp dụng các khía cạnh. Sau đó tôi có thể có một tệp/lớp mã có chứa các khía cạnh nào được áp dụng cho lớp/phương thức/v.v.

Trả lời

3

Có. Bạn có thể sử dụng tính năng đa hướng (http://www.sharpcrafters.com/blog/post/Day-2-Applying-Aspects-with-Multicasting-Part-1.aspx, http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx) hoặc bạn có thể sử dụng các nhà cung cấp khía cạnh (http://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1.aspx, http://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-13-e28093-Aspect-Providers-e28093-Part-2.aspx).

Ví dụ:

using System; 
    using PostSharp.Aspects; 
    using PostSharp.Extensibility; 

    [assembly: PostSharpInterfaceTest.MyAspect(AttributeTargetTypes = "PostSharpInterfaceTest.Interface1", AttributeInheritance = MulticastInheritance.Multicast)] 

    namespace PostSharpInterfaceTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Example e = new Example(); 
      Example2 e2 = new Example2(); 
      e.DoSomething(); 
      e2.DoSomething(); 
      Console.ReadKey(); 
     } 
    } 

    class Example : Interface1 
    { 

     public void DoSomething() 
     { 
      Console.WriteLine("Doing something"); 
     } 
    } 

    class Example2 : Interface1 
    { 

     public void DoSomething() 
     { 
      Console.WriteLine("Doing something else"); 
     } 
    } 

    interface Interface1 
    { 
     void DoSomething(); 
    } 

    [Serializable] 
    class MyAspect : OnMethodBoundaryAspect 
    { 
     public override void OnEntry(MethodExecutionArgs args) 
     { 
      Console.WriteLine("Entered " + args.Method.Name); 
     } 
    } 
} 

Tôi khuyên nếu bạn có yêu cầu phức tạp để xác định những loại có được một số khía cạnh mà bạn xem xét việc tạo ra một nhà cung cấp khía cạnh để thay thế.

+0

Các bài viết này dường như vẫn áp dụng thuộc tính cho lớp học. Tôi đã tìm kiếm dọc theo dòng cách mà Dynamic Injection động: http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx. Tôi chỉ tò mò nếu bạn có thể làm điều này với PostSharp. Kể từ khi PostSharp dệt các khía cạnh của họ như là thời gian biên dịch, có thể hiểu được nếu nó không. –

+0

Bạn muốn đạt được điều gì? Câu hỏi của bạn nói rằng "Đó là một điều ưu tiên, nhưng muốn có các khía cạnh phù hợp với các giao diện/đối tượng ở một nơi, trái ngược với các thuộc tính trên tất cả." đó là lý do tôi đưa ra câu trả lời tôi đã làm. Bây giờ có vẻ như bạn muốn bật hoặc tắt các khía cạnh khi chạy. Có vấn đề gì nếu các khía cạnh được áp dụng bằng các thuộc tính? Bạn có lo ngại về thời gian chạy so với thời gian biên dịch không? –

+0

Đã cập nhật câu hỏi. Hãy cho tôi biết nếu điều đó xóa mọi thứ. –

1

Hãy xem LOOM.NET, ở đó bạn có trình biên dịch bài đăng và trình xử lý thời gian chạy. Với phần sau, bạn có thể lưu trữ chính xác những gì bạn muốn.

0

Có thể sử dụng PostSharp XML configuration. Cấu hình XML là sự thống nhất các mô hình trình cắm thêm và dự án trong trình tải dự án.

Mô tả của .psproj có thể được tìm thấy tại http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx.

Lưu ý rằng tôi chỉ thấy các ví dụ về cách PostSharp Toolkits sử dụng cấu hình XML này. Nhưng nó sẽ hoạt động cho các khía cạnh tùy chỉnh theo cùng một cách.

Cảnh báo: Tôi nhận thấy rằng việc cài đặt Bộ công cụ PostSharp từ Nuget sẽ ghi đè tệp psproj hiện có. Vì vậy, đừng quên sao lưu nó.

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