亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

AOP之PostSharp初見-OnExceptionAspect

發布時間:2020-06-21 23:19:38 來源:網絡 閱讀:894 作者:破狼 欄目:編程語言

PostSharp 這個靜態植入的aop框架我就不多說了,在以前的aop文件,我們也嘗試用MSBuild+Mono.Cicel理解靜態植入AOP的原理。最近公司準備購買Postsharp做一些AOP,減少開發是代碼量,至于選擇AOP相信也不用多說。我也在今天重新了解了些Postsharp最新版更新,這陣子的博客更新也少了,所以準備在MSBuild+Mono.Cicel的基礎上再一些Postsharp系列。今天既然是初見,那么我們就從最簡單的OnExceptionAspect開始。

一:OnExceptionAspect

起定義如下:

AOP之PostSharp初見-OnExceptionAspect

先寫Aspect Attribute:

  1. View Code   
  2.  
  3. [Serializable]   
  4.     public class ExceptionAspectDemoAttribute : OnExceptionAspect   
  5.     {   
  6.  
  7.         public override void OnException(MethodExecutionArgs args)   
  8.         {   
  9.             var msg = string.Format("時間[{0:yyyy年MM月dd日 HH時mm分}]方法{1}發生異常: {2}\n{3}", DateTime.Now, args.Method.Name, args.Exception.Message, args.Exception.StackTrace);   
  10.             Console.WriteLine(msg);   
  11.             args.FlowBehavior = FlowBehavior.Continue;   
  12.         }   
  13.         public override Type GetExceptionType(System.Reflection.MethodBase targetMethod)   
  14.         {   
  15.             return typeof(NullReferenceException);   
  16.         }   
  17.     }  
  18. 復制代碼 

注意Postsharp的Aspect都需要標記為可序列化的,因為在編譯時會為我們二進制序列化為資源,減少在運行是的開銷,這個將在后面專門講。

上面的code繼承至OnExceptionAspect,并且override OnException和GetExceptionType,GetExceptionType為我們需要處理的特定異常。OnException為異常處理決策方法。我們的異常處理決策是當NullReferenceException時候我們會記錄日志,并且方法指定繼續(args.FlowBehavior = FlowBehavior.Continue)。

看看我們的測試代碼:

  1. View Code   
  2.  
  3. class Program   
  4.    {   
  5.        static void Main(string[] args)   
  6.        {   
  7.            Program.ExceptionAspectDemoAttribute1();   
  8.            Program.ExceptionAspectDemoAttribute2();   
  9.            Console.Read();   
  10.        }   
  11.        [ExceptionAspectDemo]   
  12.        public static void ExceptionAspectDemoAttribute1()   
  13.        {   
  14.            string s = null;   
  15.            s.GetType();   
  16.        }   
  17.        [ExceptionAspectDemo]   
  18.        public static void ExceptionAspectDemoAttribute2()   
  19.        {   
  20.            throw new Exception("exception");   
  21.        }   
  22.    }  
  23. 復制代碼 

很顯然我們的兩個方法拋出了null異常和自定義異常,預期是NullReferenceException會被撲捉,而自定義異常會中斷,運行效果如下:

AOP之PostSharp初見-OnExceptionAspect

我們在來看看postsharp為我們做了什么,當然是反編譯看看:

 

二:Postsharp的Multicasting

1:Multicasting class:

  在這隨便也說一下postsharp的Multicasting,多播這樣翻譯感覺有點死板呵呵,理解就行。利用這一點我們可以吧我們的aspect放在class,assembly等目標上匹配我們的多個目標。比如現在我們不想在我們的每個方法上加attribute,那我們可以選擇在class上,如:

AOP之PostSharp初見-OnExceptionAspect

反編譯,同樣注入了我們每個方法:

 

AOP之PostSharp初見-OnExceptionAspect

2:Multicasting assembly:

我們同樣可以利用

[assembly: PostSharpDemo.ExceptionAspectDemoAttribute()]

標記在我們的程序集上。

3:AttributeExclude:

但是注意這樣也標記了我們的aspect,某些時候可能會導致堆棧溢出 ,我們可以用AttributeExclude=true來排除。

同時我們也可以設置應用目標:AttributeTargetMemberAttributes是一個枚舉類型,定義如下:

AOP之PostSharp初見-OnExceptionAspect

比如我們需要過濾編譯時候生成的目標(自動屬性,action等等),

[assembly: PostSharpDemo1.MethodTraceAspect(AttributeExclude = true, AttributePriority = 0, AttributeTargetMemberAttributes = MulticastAttributes.CompilerGenerated)]

 4:AttributePriority:

還有AttributePriority,我們可以設置編譯時優先級。如果我們對目標標記了多個aspect,這樣postsharp就不確定注入先后順序,這樣不能確保正確性,在vs編譯時候我們會看見警告:Their order of execution is undeterministic.

AOP之PostSharp初見-OnExceptionAspect

這是時候AttributePriority就派上用途了來決定我們植入的先后優先級。

5:其他匹配

同上AttributeTargetMemberAttributes 我們還可以利用AttributeTargetMembers,AttributeTargetTypes進行目標名稱的匹配,支持模糊匹配。

附件:Demo下載

我的AOP資料:

  • AOP之PostSharp初見-OnExceptionAspect
  • AOP之PostSharp2-OnMethodBoundaryAspect
  • AOP之PostSharp3-MethodInterceptionAspect
  • AOP之PostSharp4-實現類INotifyPropertyChanged植入
  • AOP之PostSharp5-LocationInterceptionAspect
  • http://whitewolfblog.blog.51cto.com/addblog.php
向AI問一下細節
推薦閱讀:
  1. 初見html5
  2. mongodb之初見

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克| 麻栗坡县| 辽宁省| 舟山市| 南靖县| 商城县| 无极县| 竹山县| 轮台县| 通渭县| 邳州市| 彩票| 新丰县| 永泰县| 潼关县| 平武县| 连南| 静安区| 淮滨县| 叙永县| 东光县| 勃利县| 崇仁县| 潞西市| 商南县| 清苑县| 桃园县| 澳门| 寿宁县| 邹平县| 南康市| 威信县| 肥乡县| 车致| 信宜市| 资阳市| 凌源市| 文水县| 红河县| 平舆县| 敦煌市|