.NET AOP


一、AOP概述  

如果說面向對象編程(OOP)是關注將需求功能划分為不同的並且相對獨立,封裝良好的類,並讓它們有着屬於自己的行為,依靠繼承和多態等來定義彼此的關系的話;那么面向切面編程(AOP)則是希望能夠將通用需求功能從不相關的類當中分離出來,能夠使得很多類共享一個行為,一旦發生變化,不必修改很多類,而只需要修改這個行為即可。在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期間動態代理實現程序功能的統一維護的一種技術。

AOP可以說是OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但並不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。對於其他類型的代碼,如安全性、異常處理和透明的持續性也是如此。這種散布在各處的無關的代碼被稱為橫切(cross-cutting)代碼,在OOP設計中,它導致了大量代碼的重復,而不利於各個模塊的重用。

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

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

二、AOP技術實現

實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。然而殊途同歸,實現AOP的技術特性卻是相同的,分別為:

  • aspect(切面):通常是一個類,里面可以定義切入點和通知
  • joinpoint(連接點):是程序執行中的一個精確執行點,例如類中的一個方法。它是一個抽象的概念,在實現AOP時,並不需要去定義一個join point
  • pointcut(切入點):本質上是一個捕獲連接點的結構。在AOP中,可以定義一個point cut,來捕獲相關方法的調用
  • advice(通知):是point cut的執行代碼,是執行“aspect”的具體邏輯
  • introduce(引入):為對象引入附加的方法或屬性,從而達到修改對象結構的目的。有的AOP工具又將其稱為mixin
  • target(目標類):用於匹配當前目標對象類型的執行方法,其中目標對象持有指定的注解
  • proxy(代理類):AOP框架創建的對象,代理就是目標對象的加強
  • weaving(插入):是指應用aspects到一個target對象創建proxy對象的過程:complie time,classload time,runtime

上述的技術特性組成了基本的AOP技術,大多數AOP工具均實現了這些技術。它們也可以是研究AOP技術的基本術語

三、AOP的優勢  

AOP技術的優勢是顯而易見的。在面向對象的世界里,人們提出了各種方法和設計原則來保障系統的可復用性與可擴展性,以期建立一個松散耦合、便於擴展的軟件系統。例如GOF提出的“設計模式”,為我們提供了設計的典范與准則。設計模式通過最大程度的利用面向對象的特性,諸如利用繼承、多態,對責任進行分離、對依賴進行倒置,面向抽象,面向接口,最終設計出靈活、可擴展、可重用的類庫、組件,乃至於整個系統的架構。在設計的過程中,通過各種模式體現對象的行為、暴露的接口、對象間關系、以及對象分別在不同層次中表現出來的形態。然而鑒於對象封裝的特殊性,“設計模式”的觸角始終在接口與抽象中大做文章,而對於對象內部則無能為力。

通過“橫切”技術,AOP技術就能深入到對象內部翻雲覆雨,截取方法之間傳遞的消息為我所用。由於將核心關注點與橫切關注點完全隔離,使得我們能夠獨立的對“方面”編程。它允許開發者動態地修改靜態的OO模型,構造出一個能夠不斷增長以滿足新增需求的系統,就象現實世界中的對象會在其生命周期中不斷改變自身,應用程序也可以在發展中擁有新的功能。

設計軟件系統時應用AOP技術,其優勢在於:

  • 在定義應用程序對某種服務(例如日志)的所有需求的時候。通過識別關注點,使得該服務能夠被更好的定義,更好的被編寫代碼,並獲得更多的功能。這種方式還能夠處理在代碼涉及到多個功能的時候所出現的問題,例如改變某一個功能可能會影響到其它的功能,在AOP中把這樣的麻煩稱之為“糾結(tangling)”。
  • 利用AOP技術對離散的方面進行的分析將有助於為開發團隊指定一位精於該項工作的專家。負責這項工作的最佳人選將可以有效利用自己的相關技能和經驗。
  • 持久性。標准的面向對象的項目開發中,不同的開發人員通常會為某項服務編寫相同的代碼,例如日志記錄。隨后他們會在自己的實施中分別對日志進行處理以滿足不同單個對象的需求。而通過創建一段單獨的代碼片段,AOP提供了解決這一問題的持久簡單的方案,這一方案強調了未來功能的重用性和易維護性:不需要在整個應用程序中一遍遍重新編寫日志代碼,AOP使得僅僅編寫日志方面(logging aspect)成為可能,並且可以在這之上為整個應用程序提供新的功能。

總而言之,AOP技術的優勢使得需要編寫的代碼量大大縮減,節省了時間,控制了開發成本。同時也使得開發人員可以集中關注於系統的核心商業邏輯。此外,它更利於創建松散耦合、可復用與可擴展的大型軟件系統。

四、.NET中的AOP框架

目前在.NET平台中,支持的織入方式有兩種,一種是靜態織入,即編譯時織入;另外一個是動態織入,即運行時織入。

1、靜態織入

常見的靜態織入是PostSharp,但PostSharp是收費版本的,PostSharp的使用可以參考:使用PostSharp在.NET平台上實現AOP

2、動態織入

常見的動態織入是使用Castle.DynamicProxy方式,效率相對第一種要慢一點。  

五、AOP思想的應用

  • 日志記錄

  • 性能統計

  • 安全控制

  • 事務處理

  • 異常處理

將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中划分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。 

六、AOP思想示例

1、靜態織入

2、動態代理

3、IL織入

4、MVC Filter過濾器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM