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)

  • 目的:怎麼存、怎麼查最快、怎麼正規化
  • 命名:表名欄位名(subjectssubject_iddisplay_order…)
  • 特徵:PK/FK、關聯表、索引、nullable、型別

3) DTO / API Contract(傳輸模型:Request/Response)

  • 目的:前後端交換資料的格式
  • 命名:JSON keys(看團隊慣例:camelCase / snake_case)
  • 特徵:可為了方便前端而「攤平 / 嵌套」,也常會跟 Domain 不完全一致

4) ViewModel / UI State(Vue 用的資料變數)

  • 目的:讓畫面好做(展開、選取、編輯中、error、loading)
  • 命名:直接對應程式變數(subjectsselectedSubjectIdisExpanded…)
  • 特徵:大量 UI 狀態;通常是 DTO 的「加工後結果」

進階選項(也很常見)

5) Application Model / Use-case Model(應用層:Command/Query)

  • 目的:把「做一件事」的輸入輸出定義清楚(例如 CQRS)
  • 命名CreateVolumeCommandReorderVolumesCommandGetSubjectDetailQuery
  • 特徵:比 DTO 更貼近「操作」,但不一定等於 API 格式

6) Read Model(查詢視角 / 投影)

  • 目的:畫面或報表查詢用,可能是 denormalized
  • 命名SubjectListItemSubjectDetailProjection
  • 特徵:不一定可寫入;常跟查詢 SQL / 快取結構對應