1. 程式人生 > >【ABP雜燴】面向切面程式設計(AOP)知識總結

【ABP雜燴】面向切面程式設計(AOP)知識總結

目錄

1.存在問題

2.AOP的概念

3.AOP應用範圍

3.AOP實現方式

4.應用舉例

5.結束語


本文在學習【老張的哲學】系列文章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

 [Serializable]
    public class LogOperator : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            //MehodExcutionArgs提供了繫結方法的資訊和上下文
            Console.WriteLine($"【{args.Method.Name}】方法開始記錄日誌...");
        }

        public override void OnExit(MethodExecutionArgs args)
        {
            Console.WriteLine($"【{args.Method.Name}】方法結束記錄日誌...");
        }
    }

步驟三:將LogOperator切面以特性的形式新增到Main函式中

 class Program
    {
        [LogOperator]
        static void Main(string[] args)
        {
            Console.WriteLine("Hello AOP!");
        }
    }

步驟四:執行,可以看到日誌已經成功開啟

5.結束語

本文首先丟擲了在專案開發過程中遇到的問題,接著介紹了AOP的相關概念、應用範圍和實現方式,最後通過PostSharp的一個簡單的例子實現了面向切面程式設計,當然無論你選擇了哪一種方式,AOP都會提高專案的開發效率及後期的維護成本,從而避免了相同的程式碼複製-黏貼或bug修改數十、數百次,希望在平常的開發中能幫到大家。