値オブジェクトやエンティティに記述すると不自然なふるまいを解決するためのオブジェクトをドメインサービスという。

ユーザーの重複を確認するコードを、ユーザーエンティティに持たせてみると、自分自身が重複しているか確認するという不自然なコードになってしまう

var user = new User(userId, userName);
 
var res = user.exists(user);  // 生成したオブジェクト自身に問い合わせている

ドメインサービスを定義すると、自然にふるまいを記述できる

class UserService
{
  public bool Exists(user) {
    // 重複チェック
  }
}
var userService = new UserService();
var user = new User(userId, userName);
 
var res = userService.exists(user);

可能な限りドメインサービスを避ける

  • 例えば、ユーザー名の変更をドメインサービスに記述してみる
    • すると、ユーザーエンティティにはただのゲッターセッターしか残らない
      • 「ドメインモデル貧血症」が起きてしまう
  • 可能な限りドメインサービスを避け、値オブジェクト・エンティティにふるまいをもたせるべき