原創|其它|編輯:郝浩|2009-11-18 10:29:39.000|閱讀 732 次
概述:AOP即面向切面編程(Aspect Oriented Programming的縮寫),是OOP(面向對象編程)的一種延續形式。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
即面向切面編程(Aspect Oriented Programming的縮寫),是OOP(面向對象編程)的一種延續形式。是通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術,它從一個不同于OOP的角度來看待程序的結構:OOP將應用程序分解為一系列表現為繼承關系的對象; 則把程序分解為一系列方面(aspects)或者關注點(concerns)。將諸如事務管理等本來橫向分布在多個對象中的關注點進行了模塊化處理(這些關注點也常稱為橫切(crosscutting)關注點)。在中提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統級關注點,例如日志或事務支持。
下面我舉個例子來說明這一切:
場景:業務類CompanyManager在調用Save方法的時候需要調用SecurityManager類判斷權限是否足夠(圖1)。
圖1
準備條件:
第一種實現方式,我們通常會這樣做:直接在CompanyManager類中調用ISecurityManager接口的IsPass方法判斷權限。
這樣CompanyManager類與ISecurityManager或SecurityManager會發生業務性耦合。聰明的朋友會發現在GOF(設計模式)中有一種模式(代理模式)可以解除這種耦合。
第二種實現方式,代理模式(Proxy Pattern):什么是代理模式?是給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機構代表另一個人或者一個機構采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創建被代理對象,被代理對象必須有系統的其他角色代為創建并傳入(圖2)。
圖2
這樣,CompanyManager類就不必與判斷權限的類SecurityManager耦合,但是這種方式實現起來比較麻煩。
第三種實現方式,提供的:AopAlliance.Intercept.IMethodInterceptor接口和ProxyFactory類的組合。
輸出:保存數據
利用System.Reflection.Emit命名空間下的類在運行時動態創建IL代碼來生成代理。這使得代理(的創建)非常高效,并且不受任何繼承層次的限制。
參考:Spring.NET中文手冊
李會軍博客代理模式
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園