天天看點

在.NET項目中使用PostSharp,實作AOP面向切面程式設計處理

PostSharp是一種Aspect Oriented Programming 面向切面(或面向方面)的元件架構,适用在.NET開發中,本篇主要介紹Postsharp在.NET開發中的相關知識,以及一些如日志、緩存、事務處理、異常處理等常用的切面處理操作。

AOP(Aspect-Oriented Programming)是一種将函數的輔助性功能與業務邏輯相分離的程式設計泛型(programming paradigm),其目的是将橫切關注點(cross-cutting concerns)分離出來,使得程式具有更高的子產品化特性。AOP是面向方面軟體開發(Aspect-Oriented Software Development)在編碼實作層面上的具體表現。

我們知道,解耦是程式員編碼開發過程中一直追求的,AOP也是為了解耦所誕生。引入AOP技術,能很大程度上簡化我們編碼,減少複制的代碼量,也便于統一維護統一的部分代碼,如日志、緩存、事務處理、異常處理等常用的處理。

1)AOP技術介紹

AOP技術利用一種稱為“橫切”的技術,剖解開封裝的對象内部,并将那些影響了多個類的公共行為封裝到一個可重用子產品,并将其名為“Aspect”,即方面。所謂“方面”,簡單地說,就是将那些與業務無關,卻為業務子產品所共同調用的邏輯或責任封裝起來,便于減少系統的重複代碼,降低子產品間的耦合度,并有利于未來的可操作性和可維護性。AOP代表的是一個橫向的關系,如果說“對象”是一個空心的圓柱體,其中封裝的是對象的屬性和行為;那麼面向方面程式設計的方法,就仿佛一把利刃,将這些空心圓柱體剖開,以獲得其内部的消息。而剖開的切面,也就是所謂的“方面”了。然後它又以巧奪天功的妙手将這些剖開的切面複原,不留痕迹。

使用“橫切”技術,AOP把軟體系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處都基本相似。比如權限認證、日志、事務處理。Aop 的作用在于分離系統中的各種關注點,将核心關注點和橫切關注點分離開來。正如Avanade公司的進階方案構架師Adam Magee所說,AOP的核心思想就是“将應用程式中的商業邏輯同對其提供支援的通用服務進行分離。”

2)AOP使用場景

AOP用來封裝橫切關注點,具體可以在下面的場景中使用:

Authentication 權限

Caching 緩存

Context passing 内容傳遞

Error handling 錯誤處理

Lazy loading 懶加載

Debugging  調試

logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準

Performance optimization 性能優化

Persistence  持久化

Resource pooling 資源池

Synchronization 同步

Transactions 事務

3)PostSharp架構

PostSharp使用靜态織入方式實作AOP,其連接配接點非常豐富,使用簡單,而且相對其它一些.NET平台上的AOP架構來說,PostSharp較為輕量級,但是功能卻一點也不遜色。

總體來說,使用PostSharp,将會帶來如下優點:

橫切關注點單獨分離出來,提高了代碼的清晰性和可維護性。

隻要在Aspect中編寫輔助性功能代碼,在一定程度上減少了工作量和備援代碼。

當然,使用PostSharp也會存在一些缺點,主要缺點有如下兩方面:

增加了調試的難度。

相比于不用AOP的代碼,運作效率有所降低。

不過瑕不掩瑜,相對于這些缺點問題,使用PostSharp可以極大提高開發效率,減少重複代碼,進而提高代碼的可讀性、可維護性。

另外在GitHub上還有一些開源的AOP元件,例如排頭位的是KingAOP(https://github.com/AntyaDev/KingAOP),不過由于它采用了Dynamic的方式來實作,如它的構造對象如下所示。

是以雖然比較友善,而且号稱和PostSharp使用習慣類似,但是改變了對象的建立方式,對一般項目的類對象處理并不太适合。是以我還是比較傾向于使用PostSharp來進行AOP的程式設計開發。

1)準備PostSharp的編譯環境

PostSharp目前版本是4.x,我在官網下載下傳了進行使用,不過經常發生"Error connecting to the pipe server. See previous warnings for details.",後來幹脆使用了3.x版本的,反而能夠正常使用,非常不錯,呵呵。

PostSharp是一個可以安裝在VS上的插件,安裝後在VS的菜單欄目裡面增加了一個PostSharp的菜單項,如下所示。

在.NET項目中使用PostSharp,實作AOP面向切面程式設計處理

一般項目如果需要使用PostSharp特性的,在項目屬性的【PostSharp】選項頁中,使用【Add PostSharp to this project】把PostSharp加入到項目裡面進行使用。

在.NET項目中使用PostSharp,實作AOP面向切面程式設計處理

 添加後,會彈出PostSharp的插件提示對話框,提示将加入相應的PostSharp包等内容,如下所示。

在.NET項目中使用PostSharp,實作AOP面向切面程式設計處理
在.NET項目中使用PostSharp,實作AOP面向切面程式設計處理

完成後就可以在項目中使用PostSharp的相關類了。

2)增加PostSharp的AOP切面處理

一般約定每個Aspect類的命名必須為“XXXAttribute”的形式。其中“XXX”就是這個Aspect的名字。PostSharp中提供了豐富的内置“Base Aspect”以便我們繼承,其中這裡我們繼承“OnMethodBoundaryAspect ”,這個Aspect提供了進入、退出函數等連接配接點方法。另外,Aspect上必須設定“[Serializable] ”,這與PostSharp内部對Aspect的生命周期管理有關。

日志的Aspect類的代碼如下所示。

異常處理的類代碼如下所示。

計時處理的Aspect類代碼如下所示。

事務處理的Aspect類代碼如下所示。

下面是幾個Aspect類的切面處理代碼,如下所示。

從上面我們可以看到,正常的異常處理、日志處理都已經通過Attribute的方式進行處理了,在函數體裡面都隻是剩下具體的業務邏輯代碼了,這樣極大提高了代碼的可讀性,簡潔明了。

運作上面的代碼函數的調用,我們可以在輸出日志裡面看到具體的結果内容。

這樣,通過聲明的方式,就實作了正常日志 、異常的處理,當然實際項目上使用日志、異常處理的這些代碼肯定會更加複雜一些,不過小例子已經實作了切面邏輯的分離處理了,塵歸塵、土歸土,一切都是那麼的簡潔安靜了。

繼續閱讀