🎯 什麼情境該想到我
當某個重要的領域操作「不自然屬於任何一個實體或值物件」——例如轉帳牽涉兩個帳戶、計價牽涉多方規則——硬塞進其中一個物件會讓它職責失衡時。
⚙️ 怎麼用(步驟 / 公式)
意圖:把不屬於任何實體/值物件的重要領域操作,做成無狀態的服務。
- 先問:這動作能自然放進某個實體或值物件嗎?可以就別開服務。
- 不行、且它是個重要領域概念時,抽成領域服務。
- 讓服務無狀態:狀態仍留在實體與值物件裡,服務只承接一段操作。
- 以動詞/動作命名(如
TransferMoney、計算運費),並使用通用語言的詞彙。 - 介面用領域語言表達,實作可協調多個聚合完成該操作。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 別把本該放進實體的行為都倒進服務,導致「貧血模型」(物件只有資料沒有行為)。
- 領域服務屬於領域層,不要和應用服務(協調用例、交易、對外)混為一談。
- 領域服務應無狀態;需要保存狀態的是實體或值物件。