AOP面向切面編程C#實例


原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg

 

【前言】

AOP(Aspect-Oriented Programming)面向切面編程思想作為OOP的補充,在.Net領域也流行好幾年了,確實能解決OOP的頑疾,是OOP程序設計一大福音!現在各種框架組件里面,AOP已經是標配,各種筆試面試的過程中,更是不可或缺的!上一篇Eleven從理論上細談了對AOP的理解,今天直接上C#實例!

 

【靜態AOP】

 

AOP要做的就是能在不破壞封裝的前提下,去擴展新的功能!說道這里,我們應該很容易想到設計模式里面的裝飾器模式和代理模式,下面分別看看具體實現:

 

以上為原始業務,就是一個簡單的抽象+實現,里面模擬完成用戶的注冊功能。

 

組合+繼承的融合應用,是裝飾器模式的顯著特征。這里做到了通過Decorator來調用RegUser時,能在注冊用戶前后,分別加上額外的邏輯,可以是任何你需要的通用邏輯,同時也沒有破壞原有封裝!

 

 

代理模式同樣簡單,做到了通過Proxy來調用RegUser時,能在注冊用戶前后,分別加上額外的邏輯,可以是任何你需要的通用邏輯,同時也沒有破壞原有封裝!

 

注:有小伙伴兒會覺得兩個模式是一樣的,建議去歷史消息查看代理模式和和裝飾器模式的文章,有分別講解兩種模式和異同!

 

【動態AOP】

 

看完兩種靜態AOP實現后,小伙伴兒們可能有些疑問,如果擴展功能都是這樣寫死的話,好像也沒啥意義呀,而且目前這兩個也談不上通用,只是為固定業務服務的。是的,那下面就來看集中動態的AOP實現方式,這才是真的AOP實現!

 

基於.Net Remoting的RealProxy實現的動態代理,有個局限是業務類必須繼承自MarshalByRefObject類型。調用RegUser時,能在注冊用戶前后,分別加上額外的邏輯,可以是任何你需要的通用邏輯,同時也沒有破壞原有封裝!

 

基於Castle的DynamicProxy實現的動態代理,有個局限是業務類方法必須顯示聲明為virtual。調用RegUser時,能在注冊用戶前后,分別加上額外的邏輯,可以是任何你需要的通用邏輯,同時也沒有破壞原有封裝!

 

 

    動態AOP還有種實現方式是靜態織入,常見的框架有AspectSharp、PostSharp等。實現的核心原理是在程序運行之前的編譯時或者編譯后在IL的級別修改二進制程序集的方式來插入額外代碼,來完成功能的織入!這種植入是直接修改了dll文件的,基於成熟的框架實現並不難(PostSharp收費),但是有個重大缺陷是dll替換升級問題,而且調試很不方便!這里Eleven就不打算展開了。

 

【結語】

    本文展示了C#中AOP的四種實現方式,包含靜態設計模式實現和動態代理實現,同時還探討了靜態織入技術的原理和局限性。不過以上多種方式都有自己的局限性,在實際開發過程中並不太方便,下一篇文章里,我將帶來實際開發項目中,AOP的實踐,敬請期待!歡迎關注公眾號,歡迎討論,歡迎轉發,願天下有需求的人都能看到!

 

 

更多技術問題,歡迎關注公眾號【程序員在職場】進行獲取


免責聲明!

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



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