Domain Model - daniel-qa/Vue GitHub Wiki
Domain Model 專注在「業務邏輯是什麼」 以及 「物件之間的行為與規則」。
Domain-Driven Design (DDD) 的思維下,即使底層是用 Cosmos DB,我們的領域模型設計應該要與持久層無關 (Persistence Ignorant),專注於解決業務問題。
以下是針對你的需求設計的 Domain Model,我們將重點放在 Aggregate (聚合)、Entity (實體) 與 Value Object (值物件) 的劃分。
- 持久層無知 (Persistence Ignorant)
「持久層無知 (Persistence Ignorant)」設計的核心目標。
它旨在建立一個純粹的領域模型 (Pure Domain Model),只專注於:
商務邏輯 (Business Logic):例如,授權的規則、冊別順序調整的規則、科目合併的規則等。
領域行為 (Domain Behavior):例如,volume.grantAccess() 或 subject.rename() 等方法。
領域狀態 (Domain State):例如,name、type、syllabusIds 這些資料。
p.s 小專案的話,就組合著用,不必太拘泥
下面是相關參考:
常見的模型/命名分層(通常各畫一份,或至少腦中分層)
1) Domain Model(領域模型 / Entity-VO-Aggregate)
- 目的:表達業務語意與規則(不變量)
- 命名:業務名詞(Subject、Volume、AuthorizeTeacher…)
- 特徵:不含 Vue/DB 欄位、沒有 FK、沒有
isExpanded/loading
2) Persistence Model(持久層模型 / Table / ORM Entity)
- 目的:怎麼存、怎麼查最快、怎麼正規化
- 命名:表名欄位名(
subjects、subject_id、display_order…) - 特徵:PK/FK、關聯表、索引、nullable、型別
3) DTO / API Contract(傳輸模型:Request/Response)
- 目的:前後端交換資料的格式
- 命名:JSON keys(看團隊慣例:camelCase / snake_case)
- 特徵:可為了方便前端而「攤平 / 嵌套」,也常會跟 Domain 不完全一致
4) ViewModel / UI State(Vue 用的資料變數)
- 目的:讓畫面好做(展開、選取、編輯中、error、loading)
- 命名:直接對應程式變數(
subjects、selectedSubjectId、isExpanded…) - 特徵:大量 UI 狀態;通常是 DTO 的「加工後結果」
進階選項(也很常見)
5) Application Model / Use-case Model(應用層:Command/Query)
- 目的:把「做一件事」的輸入輸出定義清楚(例如 CQRS)
- 命名:
CreateVolumeCommand、ReorderVolumesCommand、GetSubjectDetailQuery - 特徵:比 DTO 更貼近「操作」,但不一定等於 API 格式
6) Read Model(查詢視角 / 投影)
- 目的:畫面或報表查詢用,可能是 denormalized
- 命名:
SubjectListItem、SubjectDetailProjection - 特徵:不一定可寫入;常跟查詢 SQL / 快取結構對應