iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
自我挑戰組

用 30 天和 ASP.NET Core 打造一個活動報名管理系統系列 第 10

ASP.NET Core - 活動報名管理系統:Day10 AOP Aspect-Oriented Programming

  • 分享至 

  • xImage
  •  

什麼是 AOP

AOP(Aspect-Oriented Programming) 切面導向程式設計,意指在不影響、修改原有的業務邏輯情況下新增、刪減服務,避免 Cross-cutting concerns(橫向切割關注點)的服務直接加入到商業邏輯的程式內,導致程式碼耦合度與複雜度提升。

何謂關注點

核心關注點

指以達成單一、特定為目的服務,或是在系統中較為核心的服務,例如商業邏輯。

  • e.g.
    • 匯出報表
    • 新增訂單

關注點分離 SoC (Seperation of Concerns)

就像是物件導向設計 SOLID 原則中的 SRP,單一職責原則,我們希望所有商業邏輯是單純的,一個 Service 就做好它的功能,不要參雜其他服務。

  • e.g.
    • 信箱服務內呼叫了 Log 服務
      • 不好的例子,服務呈現強耦合又不單一

橫向關注點

指某次要功能(小功能)被多個主要服務廣泛呼叫。當我們把每一個商業邏輯攤開時,可以將次要功能橫切出來,這一個「橫切」的部分即是橫向關注點。

  • e.g.
    • 每個主要服務執行前,需要檢查 CSRF、執行 HTML Encode
    • 每個服務執行後,需要執行 Logging Service

運用情境

若現在要在所有 function 完成後加上一個 Logging Service,在不運用 AOP 概念的情況下,你必須要在所有 function 的 code 中加入呼叫 Logging Service 的程式碼,這將會導致至少兩個問題:

  1. 幾支程式就要加幾次
  2. 提升程式之間的耦合度

OOP 的原則讓我們將商業邏輯中實作 Logging Service 的部分抽離出來,不用重複實作,但是要如何達成簡單步驟就讓整個系統去呼叫 Service,這部分就要運用 AOP。

以 ASP.NET Core MVC 實作

Action Filter

ASP.NET (Core) MVC 的 Action Filter 就算是一種 AOP 的實現,Action Filter 可以在執行 Action 前或執行後加入一些邏輯處理。

範例程式:

截圖中為進入 Edit 頁面的 Action,在 Line 123 加入 [Authorize] 這一個 Attribute 後,就必須先登入帳號才可瀏覽 Edit 的頁面,若使用者未登入,則會導向至登入頁面。

Line 124 [[TypeFilter(typeof(ActivityCreateUserAuthAttribute))]] 是在 Action 執行前,先檢查這一個活動資料與當前已登入的使用者是否相同,避免非活動建立者可以去修改、刪除這一個活動資料。

Middleware 算是 AOP 的一種實現嗎

個人認為算是,畢竟也實現了將某服務加入整個系統生命週期的某部分,並且也實現了方便抽換。

Middleware - is the new AOP?

Reference

Cross cutting concern example
AOP 觀念與術語
【Spring Boot】第20課-切面導向程式設計(AOP)
[AOP系列]簡單介紹AOP的概念
了解動作篩選 (C#)


上一篇
ASP.NET Core - 活動報名管理系統:Day9 簡述 MVC 概念
下一篇
ASP.NET Core - 活動報名管理系統:Day11 Dependency Injection
系列文
用 30 天和 ASP.NET Core 打造一個活動報名管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言