原文: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的實踐,敬請期待!歡迎關注公眾號,歡迎討論,歡迎轉發,願天下有需求的人都能看到!
更多技術問題,歡迎關注公眾號【程序員在職場】進行獲取