Encapsulating EF Core Usage 課程心得

Z-xuan Hong
Apr 16, 2022

--

https://enterprisecraftsmanship.com/.../new-course-ef.../

這課程蠻不錯的,裡面介紹到蠻多重要的概念,這邊做個總整理,如果大家看完我的心得有興趣,建議自費上上看去支持作者。

心得總結:

Module One

  • Abstraction vs Encapsulation:抽象化是強調重點刪除細節、封裝是確保使用者無腦使用API不會造成錯誤。
  • Abstraction的使用時機:如果加上間階層沒有降低複雜度,就是過度設計。
  • Abstraction Hierarchy:要降低複雜度需要使用Abstraction,Abstraction有不同的階層,higher order abstraction封裝middle order abstraction、middle order abstraction封裝lower order abstraction,abstraction之間的依賴關係只能從高到低。(跟clean code內的same level of abstraction, implementation pattern的symmetry有異曲同工之妙)

Module Two

  • Encapsulate dbContext:透過custom dbContext class來封裝config設定,降低客戶端config錯誤的機率。
  • API設計:好的API目標在於降低使用上可能的選擇 (reduce the surface of API),讓客戶端出錯的機率降低。

Module Three

  • Repository使用時機:當需要aggregate或複雜物件時,將多餘的mapping logic封裝,降低客戶端使用的複雜度。課程提到一個爭議點:如果沒什麼邏輯,直接使用DbContext也沒什麼不可,這會違反Clean Architecture當中的依賴原則、也跟DDD用Repository限制客戶端存取Aggregate內部的概念有所不同。
  • Generic Repository vs Non-Generic Repository:作者建議一律使用Non-Generic Repository,原因是讓程式碼可讀性高好、有效限制aggregate的存取 (個人認為作者自己這點打臉上面的描述)。

Module Four

  • 為什麼不要partially initialized entity:當aggregate造成效能問題時,很可能是boundary切太大,應該要重新思考boundary而不是partially initialized entity。
  • 為什麼不要使用unit of work封裝dbContext:Abstraction要能夠降低複雜度,作者認為單純使用一個介面為了封裝一行程式碼會造成更多複雜度,但也會違反Clean Architecture當中的依賴原則,work不work要等實際使用後才知道。

Module Five

  • 為什麼IQueryable, IEnumerable會導致leaky abstraction:IQueryable強迫使用者了解哪些Linq能被EF Core了解,哪些不行,造成leaky abstraction、IEnumerable強迫我們了解dbContext是否被dispose,造成leaky abstraction。作者建議回傳IReadOnlyList,能降低mutable的風險,也不會有leaky abstraction的問題。
  • 遵守參數generic、回傳型態specific的原則:參數越是generic,客戶端越能透過多型傳入不同概念;回傳型態越是specific,客戶端越能簡單使用需要的功能,而不會需要casting成自身想要的介面,降低runtime error與leaky abstraction的機率。

雖然普遍在業界沒什麼人care這些問題,working is enough :)) 。

還是多刷點Leetcode比較實在 :((( 。

--

--

Z-xuan Hong
Z-xuan Hong

Written by Z-xuan Hong

熱愛軟體開發、物件導向、自動化測試、框架設計,擅長透過軟工幫助企業達到成本最小化、價值最大化。單元測試企業內訓、導入請私訊信箱:t107598042@ntut.org.tw。

No responses yet