ドメインサービスはステートレスな操作に限定する
ルール
ドメインサービスはステートレスでなければならない。もし状態を持ちたくなったら、それはエンティティとして設計すべきサインである。
また、ドメインサービスを作成する前に「このロジックはどのエンティティ・値オブジェクトが担うべきか?」を必ず問うこと。どうしても収まらない場合にのみドメインサービスとして切り出す。
理由
ドメインサービスが増えすぎると貧血ドメインモデルに回帰する。本来エンティティが持つべきロジックをドメインサービスに置くと:
- エンティティがデータの入れ物になり、ロジックはサービスに集まる
- 「このロジックがどこにあるか」がわかりにくくなる
- ドメインオブジェクト単体でのユニットテストができなくなる
ドメインサービスは「どのエンティティにも属せない、でも明らかにドメインの重要な概念を表している操作」だけを受け持つ。
例外
- 外部サービス(認証、通知、決済)との統合ポイント
- 複数の集約ルートをまたぐ計算(集約の設計原則上、単一集約に収められない)
- ドメインポリシーの検証(複数の集約の状態を参照して判断する)
関連概念
出典
実践ドメイン駆動設計(Vaughn Vernon)第7章