當前位置:
首頁 > 知識 > .NET切面編程——PostSharp

.NET切面編程——PostSharp


概念

Aspect-Oriented Programming(AOP):想想OOP是不是有些熟悉,AOP翻譯過來的意思就是面向切面編程。先來關注一下涉及到的以下幾個概念點。

橫切關注點:

存在於項目的絕大多數業務中可以通用的一些輔助性的功能。例如日誌、安全、持久化等模塊。它們存在於核心業務代碼塊的各個地方,卻又獨立於這些核心業務邏輯。

如圖所示:

.NET切面編程——PostSharp

  • 切面:

    這些橫切關注點的統一抽象。

  • 所以面向切面編程,就是將項目的輔助性功能(如日誌、異常處理、緩存處理等)與業務邏輯進行分離,把繁瑣的輔助性代碼抽離出來不用重複Copy,使得程序具備更高的模塊化。

實現方式

  • 靜態織入

    即編譯時織入,實現原理是對編譯器做擴展,使得在代碼編譯時編譯器將切面代碼織入到指定的切點。

  • 動態織入

    即運行時織入,編譯器在編譯時對切面代碼和業務代碼分別獨立編譯,而在運行的時候由CLR進行代碼混合。

.Net平台的切面實現——PostSharp

  • 為什麼選用PostSharp

  1. 輕量級的靜態織入實現(可以通過反編譯清晰的知道你的代碼構成)

  2. 使用簡單,獨立編寫切面類,更好的實現模塊化,繼承自PostSharp提供的各種切面類型的抽象類,並重寫其中的攔截方法即可,可以像使用類庫內置的Attribute那樣使用AOP

  3. 對調用方法有更多的控制點,比如輸入參數、返回結果、異常捕獲等

  4. 但是,但是自從2.0版本之後就不免費了

  • PostSharp的切面類

  1. OnMethodBoundaryAspect,針對方法內的各種可能存在切點的情況進行代碼注入,實現切面思想,提供了OnEntry,OnExit,OnSuccess,OnException等可重寫的虛方法,顧名思義分別是在進入方法、退出方法、方法體成功執行、方法內發生異常的攔截。後續的實例是通過OnEntry來修改方法的輸入參數來展示的。

  2. OnFiledAccessAspect,對Filed的讀寫進行攔截處理,提供了OnGetValue,OnSetValue的虛方法。

  3. OnExceptionAspect,實現異常的捕獲。

  4. OnMethodInvocationAspect,方法調用攔截,提供OnInvocation虛方法。

  5. ImplementMethodAspect,用於extern方法、abstract類的方法進行攔截。

  • PostSharp的版本差異

    3.0版本是個分水嶺,目前最新版本是5.0.28,他們的使用方式有一小點差異。

  • 3.0版本之前下載了安裝包,在項目中引用postsharp.dll,之後編碼就可以了

  • 但是3.0之後是類似於VS插件的方式工作的,下載postsharp安裝包安裝之後會在vs的菜單中新增一個postsharp菜單(如下圖),可以進行一些設置,在使用的時候不再是引用,而是需要項目上右擊「添加postsharp到項目」

.NET切面編程——PostSharp


PostSharp示例

  1. 做前期準備工作,從PostSharp官網下載最新版本的安裝包,並安裝。

  2. 打開VisualStudio,新建解決方案,添加命令行項目。項目上右鍵後點擊「Add PostSharp to project」後在彈出窗口按提示操作,會發現已經多了postsharp的引用。

.NET切面編程——PostSharp

.NET切面編程——PostSharp


添加AspectAttribute切面類,實現對核心方法的輸入參數修改。需要注意的是postsharp提供的幾種切面類型都是繼承自Attribute基類,而且是通過對要實現攔截的類或方法添加特性的方式實現切面思想的。所以我們的切面類 需要按照約定以xxxAttribute的格式命名。

[Serializable]

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]


public class AspectAttribute : OnMethodBoundaryAspect

{

//方法進入時

public override void OnEntry(MethodExecutionArgs args)

{

//修改輸入參數

args.Arguments[0] = "jingdong";

//設置方法是否繼續執行或退出,若設置的是FlowBehavior.Return方法會直接退出,不執行後續的所有代碼。

args.FlowBehavior = FlowBehavior.Continue;

}

//方法離開時

public override void OnExit(MethodExecutionArgs args)

{

Console.WriteLine("exit");

}

//方法成功執行時

public override void OnSuccess(MethodExecutionArgs args)

{

Console.WriteLine("success");

}

}

在program中添加我們的核心方法Start,列印輸入參數。在需要實現攔截的方法添加上一個步驟中實現的切面類特性

public class Program

{

static void Main(string[] args)

{

var arg = "tmall";

Console.WriteLine($"original argument:{arg}");

Start(ref arg);

Console.Read();

}

[Aspect]

static void Start(ref string arg)

{

Console.WriteLine($"real argument:{arg}");

Thread.Sleep(1000);

Console.WriteLine("finished");

}

}

由此就簡單通過postsharp實現了對方法的攔截,修改輸入參數,監聽方法成功執行以及退出。看下執行結果,成功的篡改了輸入參數,並且可以看出攔截方法的方法體是先於OnSuccess執行的,OnSuccess的攔截執行完成之後才是OnExit。

.NET切面編程——PostSharp

之前有說過postsharp是靜態織入來實現AOP編程的,那麼肯定是通過編譯器在編譯的時候對代碼進行了織入,可以通過反編譯exe文件來看下。

.NET切面編程——PostSharp

有一個小點需要注意,使用postsharp的時候對切面類必須添加Serializable特性,否則在編譯的時候就會報錯。

.NET切面編程——PostSharp


小結

文章內的小例子主要是為了說明postsharp實現AOP的基本原理,以及實現過程。並沒有如同實際項目中使用AOP來做一些日誌、安全、持久化之類的輔助功能。

.NET切面編程——PostSharp


更多優質內容推薦:

有錢任性,某公司豪擲500萬幫助20左右年輕人找工作,起因是做善良的人:

http://www.ujiuye.com/zt/jyfc/?wt.bd=zdy35845tt

學安卓,免學費!50天興趣課程等你來搶!

http://www.ujiuye.com/xydt/2017/13042.html?wt.bd=zdy35845tt

IT職業教育:http://xue.ujiuye.com/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

純 CSS 實現波浪效果!
課程與時代肩並肩,Linux+Python課程再升級!
設計模式解密(9)-裝飾者模式
ASP.NET CORE小試牛刀:乾貨(完整源碼)

TAG:IT優就業 |

您可能感興趣

ASP.NET Web Forms 編程
ASP.NET Web Forms 維持 ViewState
ASP.NET Web Forms Button 控制項
ASP.NET Web Forms編程HTML 頁面
ASP.NET Web Forms ArrayList 對象
SOPHNET. x Converse 全新聯名鞋款 All Star Zip-Up
A BATHING APE x《Ralph Breaks the Internet》跨界聯名系列上架
修復.NET的HttpClient
一文讀懂物體分類AI演算法:LeNet-5 AlexNet VGG Inception ResNet MobileNet
談談ASP.NET Core中的ResponseCaching
Liquidity Network、Fantom 正式登陸 TOP.ONE
包+香薰片!SOPHNET. x retaW x fragment design三方聯名登場!
Oracle 收購 SD-WAN 提供商 Talari Networks
ASP.NET Web Forms 數據綁定
ASP.NET Web Forms 編程HTML 表單
改裝檔案|BMW R nineT之鐵血閃電 Project Autobahn Streak by JSK
Preferred Networks將推出搭載NVIDIA Tesla V100
BOTTEGA VENETA(葆蝶家) Olimpia baby Intrecciato 水蛇皮單肩包
日潮也能玩Beatles?SOPHNET. x Julian Opie打造全新聯名系列
快速搭建CentOS+ASP.NET Core環境支持WebSocket