ドメインサービス
定義
ドメインサービス(Domain Service)とは、ドメインロジックのうち特定のエンティティや値オブジェクトに自然に属さない操作を担うオブジェクト。次の3条件が揃う場合にドメインサービスとして切り出す:
- 操作がドメインの重要な概念を表している
- どのエンティティや値オブジェクトにも自然に収まらない
- インターフェースがドメインの他の要素(エンティティ・値オブジェクト)で定義されている
ドメインサービスはステートレス(状態を持たない)であり、ユビキタス言語で名付ける。
なぜ重要か
ドメインサービスを設けないと、どこにも収まらないロジックがアプリケーションサービス(ユースケース層)に流出し、ドメインが貧血になる。
また、アプリケーションサービスとドメインサービスを混同すると、ドメインロジックがテスト困難な技術的コードの中に埋没する。
| ドメインサービス | アプリケーションサービス | |
|---|---|---|
| 関心事 | ドメインロジック | ユースケースの調整(トランザクション等) |
| 状態 | なし | なし |
| ドメイン知識 | 持つ | 持たない(委譲する) |
| テスト | ドメインオブジェクトのみ使ってユニットテスト可 | 統合テストが必要になりがち |
適用場面
- 複数の集約をまたがる計算(送金:送り手と受け手の残高変更)
- 外部サービスを使うが、インターフェースはドメインが定義する(認証・通知)
- 「〜ポリシー」「〜ファクトリー」「〜検証」のような操作
注意点
ドメインサービスは最後の手段。まず「このロジックはどのエンティティ・値オブジェクトに属するか?」を問い、どうしても収まらない場合にのみドメインサービスとして切り出す。ドメインサービスが増えすぎると貧血ドメインモデルへの回帰になる。
関連概念
出典
実践ドメイン駆動設計(Vaughn Vernon)第7章