2013-10-02 15 views
5

Tôi đang xem xét việc sử dụng bài đăng sắc nét và tôi đang cố gắng tổng hợp một vài bản trình diễn. Một trong số đó là một khía cạnh sẽ ghi lại các ngoại lệ, và một khía cạnh khác là kiểm tra các đối số rỗng và ném một ngoại lệ khi một người gặp phải.Áp dụng các khía cạnh cho các khía cạnh với postsharp

Sự cố tôi gặp phải là tôi muốn khía cạnh đăng nhập ngoại lệ của mình để ghi lại các ngoại lệ được ném bởi khía cạnh kiểm tra rỗng. Nó dường như không hoạt động. Có ai biết cách để thực hiện công việc này không?

EDIT: Để được rõ ràng, các logger ngoại lệ được làm việc với các trường hợp ngoại lệ được ném bên ngoài của một khía cạnh, nhưng isnt đăng các trường hợp ngoại lệ thown trên NullCheckAttribute

Mã cho kiểm tra null khía cạnh như sau

[Serializable] 
public class NullCheckAttribute : OnMethodBoundaryAspect 
{ 
    [ExceptionLogger] 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     foreach (var argument in args.Arguments) 
     { 
      if (argument == null) 
       throw new InvalidOperationException("Null argument in " + args.Method.Name); 
     } 
    } 
} 

Và mã cho các ngoại lệ logger

[Serializable] 
public class ExceptionLoggerAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnException(MethodExecutionArgs args) 
    { 
     Console.WriteLine("Exception thrown in " + args.Method.Name); 
     Console.WriteLine("***Message: " + args.Exception.Message); 
     Console.WriteLine("***Stack trace: " + args.Exception.StackTrace); 
    } 
} 

tôi cũng nên đề cập đến mà tôi đang đơn giản là sử dụng một giấy phép miễn phí cho điều này.

+1

'Nó dường như không hoạt động.' - chính xác những gì đang xảy ra? – Muctadir

+0

Trình ghi nhật ký ngoại lệ hoạt động tốt với các trường hợp ngoại lệ bình thường, nhưng các trường hợp được ném vào NullCheckAttribute arent đang được ghi lại. –

+0

bạn đã gỡ lỗi 'NullCheckAttribute' để thấy rằng' MethodExecutionArgs' thực sự là null? – Muctadir

Trả lời

7

PostSharp không cho phép bạn áp dụng các khía cạnh trên một lớp khía cạnh, đó là những gì bạn đang cố gắng thực hiện bằng cách áp dụng [ExceptionLogger] trong lớp NullCheckAttribute.

Hiện tại, nếu một thuộc tính khía cạnh được phát hiện trên một lớp khía cạnh, thì nó được bỏ qua âm thầm. Nó hoạt động theo cách này bởi vì hầu hết thời gian ứng dụng này là vô tình (thông qua multicasting).

Cách chính xác để đạt được hiệu quả mong muốn (đăng nhập ngoại lệ được ném bằng kiểm tra rỗng) là áp dụng cả hai thuộc tính cho phương pháp đích. Ngoài ra, hãy nhớ rằng thứ tự của các thuộc tính được áp dụng quan trọng. Nếu bạn thay đổi nó cho ví dụ này, thì bạn sẽ không thấy thông điệp tường trình của bạn - bởi vì kiểm tra null sẽ được thực thi trước khi try/catch được giới thiệu bởi trình ghi nhật ký ngoại lệ.

[ExceptionLogger(AspectPriority = 1)] 
    [NullCheck(AspectPriority = 2)] 
    private void TestMethod(string s) 
    { 
     Console.WriteLine(s); 
    } 
+0

Cảm ơn bạn đã giúp đỡ :) –

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