ASP.NET MVC Advanced Developer (DI, ORM & AOP)
2022-02-20
筆記 ASP.NET 現代軟體工程開發方式,整理進階與物件導向開發的結合技術,例如 Dependency Injection、 Object Relational Mapping 與 Aspect Oriented Programming 以及相關的搭配工具,例如 Autofact、Dapper 與 ASP.NET Boilerplate (ABP)
說明
Dependency Injection
DI 又稱為依賴注入,是為了讓程式保持擴充彈性的 Coding 方式。以前曾經由 Pluralsight 學習,並整理成筆記,但在真實的應用場景,如 ASP.NET MVC 的開發上仍是沒有使用 DI 的方式。但到了 .NET 6 (ASP.NET Core) 以後 DI 成為 MVC 框架預設的一環,使用上可能會更為直覺。
而若真要應用 DI ,可能是要配合專案的規模提升,複雜度增加自然推動的需求,或者是改採 .NET 6 (ASP.NET Core) 後依照框架的要求主動加入使用 DI 的開發使用。
延伸方向:ASP.NET Boilerplate Dependency Injection & Dependency injection in ASP.NET Core
Object Relational Mapping
ASP.NET MVC 預設上使用的 Entity Framework 就是 ORM 框架,讓開發人員不在需要寫 SQL Query,讓 ORM 框架負責與 DB 的溝通,開發人員僅需享受以物件操作的方式來使用資料庫。而開發流程又可以在分為 Database First 或者是 Code First (Model First 使用的情境與案例還有沒碰到過 😶)。
但使用 Entity Framework 完全託付給框架負責與資料庫溝通,可能會有 Query 組合過於複雜導致的效能問題,雖然有替代的方式可採 Raw Query 的方式。但另有流派主張僅善用 ORM 強型別的好處,但實際上與資料庫的互動 Query 仍是由開發者完成,而這樣的產物就是 Dapper。
目前碰到的專案還沒有使用 Dapper 的經驗,但參考各界的心得覺得值得一試,同時 Entity Framework 雖然美好,但不深入其細節就使用資料庫的方式總是不太安心,若先藉由 Dapper 來學習 ORM 自行設計 Model 與 Class 並實際下 Query,再往 Entity Framework 去深入,從而統整再一起,或許會是對 ORM 有更深入的認識的一種學習方式。
總而言之,就先來個 Dapper 實驗吧。
延伸方向:Dapper,並參考 igouist 在 菜雞新訓記 (3): 使用 Dapper 來連線到資料庫 CRUD 吧 關於 Dapper 的介紹。
Aspect Oriented Programming
在還不知道 AOP 之前,喜歡 ASP.NET MVC 的一個原因,就是可以利用 Action Filter 來在 Request Lifecycle 中加入程式邏輯,不論是要 Logging、Authentication 或者是其他需要再多個 Action 當中重複的業務邏輯。後來才從 Mars 的文章 看到 AOP 這個名詞。搜尋之後才發現原來 AOP 已經是軟體開發中盛行的方式,奇怪,迄今讀過的 MVC 教材怎麼都沒提過 🤔
接著從 AOP 深入之後,發現其是為了補充 OOP 開發上的限制,對於紀錄 (Logging) 或者是授權檢查 (Authentication) 因為在反覆出現在各 OOP 的邏輯當中,程式碼的流程會過於複雜,也不好維護。而藉由 Aspect Oriented Programming 的方式切割關注點,在 ASP.NET MVC 框架上原生的處理方式就是藉由 Action Filter 來切割,此外還可以利用 .Net HttpModule 或者是 Request Lifecycle 當中的各式 Event (Application_Start、Application_End) 等來達到 AOP。
其中關於 HttpModule 的介紹,可以參考石頭的文章,石頭用了一個很棒的比喻,對於 Request Lifecycle 而言,HttpModule 是經過的各個車站,當中都可以加入程式邏輯,但最終 Request 會到達終點也就是 HttpHandler,在 MVC 而言就是 Contoller。
同時 AOP 的強大,甚至有專門的框架誕生,例如 Open Source 的 ASP.NET Boilerplate,或者是需要費用的 PostSharp。
但以目前所遇到的專案而言,使用 Action Filter 就已經十分足夠,無論是在處理 Logging 或者是 Authentication,同樣地等專案的規模與複雜度在提升,可能才會有深入 AOP 框架的必要。