ドメインサービス
クライアントのために何かを行うオブジェクト
ValueObjectやエンティティに記述すると不自然になる振る舞いを記述する.
UserIdの重複確認など.
Userが持つとuser.Exists()と書いたり,checkObject.Exists(user)と書いたりして不自然になる.
code:Check.cs
var userService = new UserService();
var user = new User();
bool duplicated = userService.Exists(user); // 自然な記述
重複確認がドメインからの要望であればドメインサービスに書くが,アプリケーションの要望であればアプリケーションサービスに記述する.
物流における物流拠点はエンティティだが,輸送の操作はドメインサービスが良さそう.
複数のドメインオブジェクトを横断するような操作.
ドメインサービスに全てを記述しないように注意する.
ドメインオブジェクトが持てる振る舞いはValueObjectに持たせる.
迷ったらドメインオブジェクトに定義する.
ドメインオブジェクトが振る舞いを一切持たず,自己文書化をなしていない状態をドメインモデル貧血症と呼ぶ.