🎯 什麼情境該想到我
當你希望領域層「像操作一個記憶體集合那樣」取得與保存物件,而不必在領域邏輯裡摻進 SQL、ORM 或查詢細節時。
⚙️ 怎麼用(步驟 / 公式)
意圖:提供像集合的介面來存取聚合根,封裝背後的持久化細節。
- 只對聚合根設計 Repository,一個聚合對應一個 Repository(不替聚合內部物件設)。
- 介面用領域語彙描述:如
add、findById、remove、依條件查詢,回傳的是完整、可用的聚合。 - 把資料庫、快取、查詢組裝等細節藏在實作裡,領域層只依賴介面。
- 需要複雜篩選時,讓 Repository 接受規格物件來表達查詢條件。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 不要替非聚合根的實體開 Repository,否則會繞過聚合根破壞邊界。
- Repository 是領域概念,別讓它退化成到處是 CRUD 方法的資料存取層(DAO)。
- 若只是單純建立物件、而非取回既有物件,那是工廠的職責,別混在一起。