AOP(Aspect-Oriented Programming) 切面導向程式設計,意指在不影響、修改原有的業務邏輯情況下新增、刪減服務,避免 Cross-cutting concerns(橫向切割關注點)的服務直接加入到商業邏輯的程式內,導致程式碼耦合度與複雜度提升。
指以達成單一、特定為目的服務,或是在系統中較為核心的服務,例如商業邏輯。
就像是物件導向設計 SOLID 原則中的 SRP,單一職責原則,我們希望所有商業邏輯是單純的,一個 Service 就做好它的功能,不要參雜其他服務。
指某次要功能(小功能)被多個主要服務廣泛呼叫。當我們把每一個商業邏輯攤開時,可以將次要功能橫切出來,這一個「橫切」的部分即是橫向關注點。
若現在要在所有 function 完成後加上一個 Logging Service,在不運用 AOP 概念的情況下,你必須要在所有 function 的 code 中加入呼叫 Logging Service 的程式碼,這將會導致至少兩個問題:
OOP 的原則讓我們將商業邏輯中實作 Logging Service 的部分抽離出來,不用重複實作,但是要如何達成簡單步驟就讓整個系統去呼叫 Service,這部分就要運用 AOP。
ASP.NET (Core) MVC 的 Action Filter 就算是一種 AOP 的實現,Action Filter 可以在執行 Action 前或執行後加入一些邏輯處理。
範例程式:
截圖中為進入 Edit 頁面的 Action,在 Line 123 加入 [Authorize]
這一個 Attribute 後,就必須先登入帳號才可瀏覽 Edit 的頁面,若使用者未登入,則會導向至登入頁面。
Line 124 [[TypeFilter(typeof(ActivityCreateUserAuthAttribute))]]
是在 Action 執行前,先檢查這一個活動資料與當前已登入的使用者是否相同,避免非活動建立者可以去修改、刪除這一個活動資料。
個人認為算是,畢竟也實現了將某服務加入整個系統生命週期的某部分,並且也實現了方便抽換。
Cross cutting concern example
AOP 觀念與術語
【Spring Boot】第20課-切面導向程式設計(AOP)
[AOP系列]簡單介紹AOP的概念
了解動作篩選 (C#)