PostSharp 中 AOP 功能的簡單使用
獨立觀察員 2021 年 2 月 21 日
年前在研究 .NET 中如何實作 AOP(Aspect-Oriented Programming,面向切面的編程)時看到了一篇叫做《C# 進階系列 ——AOP?AOP!》的文章,作者在文章中介紹了靜態攔截(裝飾器模式)、動態代理(使用微軟企業庫)、IL 編織(使用 PostSharp)三種方式;而在作者提供的原始碼中,則是提供了前兩者以及另外一種動態代理(使用 .Net Remoting / RealProxy)共三種方式;本人在原代碼的基礎上,改控制臺測驗程式為 Winform 測驗程式,并補充上 PostSharp 的演示代碼,
本文將介紹如何使用 PostSharp 中的 AOP 功能,實作在不修改原業務方法的情況下,記錄方法運行的額外資訊,
首先使用 NuGet 安裝 PostSharp:

然后我們就可以新建一個 AOP 的功能類(AOP_PostSharp),繼承 PostSharp.Aspects.OnMethodBoundaryAspect,OnMethodBoundaryAspect 類的功能就是能夠在被應用的方法體前后插入代碼片段,該類也是有一系列的繼承關系,最終的基類為 C# 的特性類 Attribute,所以我們新建的類實際上也是一個特性類,

OnMethodBoundaryAspect 類有 OnEntry、OnException、OnExit、OnResume、OnSuccess、OnYield 等虛方法:

我們重寫了其中的 OnEntry、OnExit、OnException 三個方法,分別在方法執行前、執行后、發生例外時執行,我們這里就是記錄了一下執行情況,
然后再加一個業務類,當作測驗類(AOP_PostSharp_Tester),其中有個建構式和兩個業務方法,完整代碼如下:
using PostSharp.Aspects; using System; namespace MyAOPApplication { /// <summary> /// AOP 功能類 /// </summary> [Serializable] public class AOP_PostSharp : PostSharp.Aspects.OnMethodBoundaryAspect { //發生例外時進入此方法 public override void OnException(MethodExecutionArgs args) { base.OnException(args); Console.WriteLine($"發生例外了:{args.Exception}"); } //執行方法前執行此方法 public override void OnEntry(MethodExecutionArgs args) { base.OnEntry(args); Console.WriteLine($"即將執行方法 {args.Method}"); } //執行方法后執行此方法 public override void OnExit(MethodExecutionArgs args) { base.OnExit(args); Console.WriteLine($"方法執行結束 {args.Method}"); } } /// <summary> /// AOP 測驗類(業務類) /// </summary> [AOP_PostSharp] public class AOP_PostSharp_Tester { public AOP_PostSharp_Tester() { Console.WriteLine("建構式"); } //[AOP_PostSharp] public void Method1() { Console.WriteLine("方法一"); } public void Method2() { Console.WriteLine("方法二"); throw new Exception("測驗拋出例外"); } } }
可以看到,我們在 AOP_PostSharp_Tester 類上添加了 AOP_PostSharp 特性,這樣在該類中的每個方法執行程序中都會觸發 AOP_PostSharp 類中的相關方法了,
接下來就是運行了,由于 PostSharp 從 2.0 開始要收費了,所以彈出了個選擇許可證的視窗,同時編譯出錯了:

許可證視窗有三個選項,分別是使用社區版(有限制)、試用旗艦版(45 天)、添加許可證,這里我們選擇第一個:

然后是同意許可條款:

接下來是選擇感興趣的領域,可以看到 PostSharp 功能很強大,并不止局限于 AOP,這里至少要選擇一項:

按照我們代碼的需求,應該只要選擇第一個 Logging/tracing 就行了,為了保險起見,選擇了 Diagnostics 類目下的全部三個:

這樣之后就能順利編譯了,測驗程式中就是呼叫了測驗類的兩個方法:

當把 AOP_PostSharp 特性放在類上時,從運行結果可以看出類中每個方法的執行程序都被記錄了:

而如果只把 AOP_PostSharp 特性放在某個方法上時,則只有這個方法的執行程序被記錄了:

由此可見 PostSharp 的 AOP 功能十分簡單易用且強大,無需對業務類和方法做任何改動,只需加上個特性,就能達到記錄資訊的需求,可用于方法執行程序的監控、執行時間記錄、例外記錄等,大家可以自行探索,祝大家使用愉快,
最后,附上原始碼地址:https://gitee.com/dlgcy/MyAOPApplication
原創文章,轉載請注明: 轉載自 獨立觀察員?博客
本文鏈接地址: PostSharp 中 AOP 功能的簡單使用 [http://dlgcy.com/postsharp-aop/]
微信公眾號
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/263157.html
標籤:C#
