目錄
本文在學習【老張的哲學】系列文章AOP相關章節后,自己歸納總結的筆記。
1.存在問題
最近,其它項目小組在開發的過程中遇到了一個問題,在日志記錄時,用戶明明點擊的是更新操作,可翻看記錄時卻發現是查詢操作,起初是一頭霧水,后面跟蹤該更新操作的代碼后才發現,在日志記錄時確實是寫着查詢,說到這里,大家可能已經知道問題的所在了,這是由於在開發的過程中,開發員直接從查詢的方法里把日志記錄的代碼直接copy過來,而后面又忘記修改,相信其它的方法里也同樣是存在這樣的問題。
在平常的開發過程中,日志往往采取如下圖的編程方式,在小項目中這種方法簡單快捷,沒有太大的問題,但對於比較大的項目,這樣重復的代碼會造成后期的維護成本比較高的,萬一哪天說日志記錄要換換格式或采用第三方庫,估計就蛋疼了。
問題是發現了,有沒有改進的方法呢?答案是肯定的。這個時候AOP該閃亮登場了,第一次學習【老張的哲學】系統文章時,也沒怎么注意到AOP這個知識點,當時就懵懵懂懂,可后面發現在很多的開源框架里都有涉及到AOP的概念,所以借此機會自己也學習一下,時機成熟時也可以引入到項目里。
2.AOP的概念
AOP是Aspect Oriented Programing的縮寫,中文翻譯為面向切面編程,是通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從面使得業務邏輯各部分之間的耦合度低,提高程序的可重用性,同時提高開發的效率。
通俗的講:面向切面編程是在不影響原有功能的前提下,可為軟件橫向擴展,即可插拔,拔掉軟件正常運行,插上擴展功能起效果。
3.AOP應用范圍
既然把AOP說得那么厲害,那它到底可以用到哪些地方呢?
- 日記功能
- 審計功能
- 驗證功能
- 安全控制
- 事務處理
- 異常處理
- ......
3.AOP實現方式
在.net core中,AOP的實現可以通過以下三種試:
過濾器(Filter):適用於身份驗證、參數驗證、處理耗時的Web服務
動態代理(DynamicProxy):適用功能模塊間的解耦和重用
中間件(Middleware):適用底層服務的通信
主要框架有:
編譯時:PostSharp、LinFu、SheepAspect、Fody、CIL
運行時:Castle Windsor、StructureMap、Unity、Spring.NET
4.應用舉例
在本文中主要利用PostSharp實現AOP例子,PostSharp是一個在.net平台上實現的AOP框架,是一個收費的框架。好拉,下面將利用PostSharp解決開篇提到的問題,通過AOP為系統添加日志記錄功能。
步驟一:新建項目FirstAOP,並添加PostShap
步驟二:定義LogOperator日志記錄類,並繼承OnMethodBoundaryAspect
步驟三:將LogOperator切面以特性的形式添加到Main函數中
步驟四:運行,可以看到日志已經成功開啟
5.結束語
本文首先拋出了在項目開發過程中遇到的問題,接着介紹了AOP的相關概念、應用范圍和實現方式,最后通過PostSharp的一個簡單的例子實現了面向切面編程,當然無論你選擇了哪一種方式,AOP都會提高項目的開發效率及后期的維護成本,從而避免了相同的代碼復制-黏貼或bug修改數十、數百次,希望在平常的開發中能幫到大家。