2017-04-10 61 views
1

我在一個使用postsharp免費版的公司工作了3個月。演示postsharp是否與狀態機方法一起工作

但是,該項目有幾個使用自定義方面的狀態機方法(帶有一些linq查詢的async和其他方法),使用自定義方面而沒有「ApplyToStateMachine」配置,開發人員忽略了警告。

免費版只允許在每個項目的10個類中使用「ApplyToStateMachine」,但是項目中還有更多。

我需要證明這個問題可以讓老闆說服購買postsharp許可證。是否有一些示範項目或某些方向可以說明這些方面與狀態機方法有關的問題?

預先感謝您!

回答

1

應該不是很難說服他,只是給他這樣的代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Wrapper(); 
     Console.ReadKey(); 
    } 

    static async void Wrapper() { 
     try { 
      await Test(); 
     } 
     catch { 
      Console.WriteLine("exception caught"); 
     } 
    } 

    [MyAspect] 
    static async Task Test() { 
     Console.WriteLine("started"); 
     await Task.Delay(100); 
     Console.WriteLine("second part"); 
     throw new Exception("exception"); 
    } 
} 

[PSerializable] 
class MyAspect : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Console.WriteLine("OnEntry"); 
    } 

    public override void OnSuccess(MethodExecutionArgs args) 
    { 
     Console.WriteLine("OnSuccess({0})", args.ReturnValue); 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Console.WriteLine("OnExit"); 
    } 

    public override void OnException(MethodExecutionArgs args) 
    { 
     Console.WriteLine("OnException({0})", args.Exception.Message); 
    } 
} 

它輸出如下:

OnEntry 
started 
OnSuccess(System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]) 
OnExit 
second part 
exception caught 

我們可以看到? 4方面的方法,我們只覆蓋一個作品 - OnEntry

OnSuccess執行得太早,當我們的異步方法的第一部分結束時(所以,就在第一次等待之前)。更多 - 這是錯誤的,因爲方法引發了一個異常。

OnExit太早調用(顯然)。

OnException根本沒有被調用,儘管方法拋出了異常。因爲任何合理的方面,甚至簡單的日誌記錄或測量執行時間都會被打破,或者(更糟糕的是)會產生更多的結果,因此,幾乎所有的事情都會被打破,並且不能按預期工作,不知道它如何可用。結果不正確。

如果我們設置ApplyToStateMachine它會產生正確的輸出:

OnEntry 
started 
second part 
OnException(exception) 
OnExit 
exception caught 
相關問題