この記事は、筆者がドメイン駆動設計に関する本をいくつか読んだ結果つかえそうだとおもった知識をまとめるための記事です。
ドメインサービスって?
業務知識の詰まった、ドメインに含めるべき処理であるが、それを直接エンティティや値オブジェクトのメソッドにすることがためらわれる場合につくると便利なサービス。
ためらわれるときって?
ひとつには、複数の集約にまたがった処理をする必要がある場合。ドメインを直接操作してタスクをこなすクライアントでありながら、自身もドメインの知識であるならそれはドメインサービスとする。
ほかにも、単一の集約に対する操作ではあっても、そのメソッドとして記述してしまうと、ユビキタス言語をなめらかに表現したコードにならないとおもわれる場合はドメインサービスとする。
要はドメインのメソッドを切り出したもの?
ドメインサービスはその処理自身が業務知識となるが、無制限にドメインサービスとしてしまうとドメインが貧相になるので、まずはドメインとして記述する方法を模索し、うまくいかなそうなときに慈善の策としてドメインサービスを検討するとよさそう。
また、ドメインサービスは状態をもつこともさけるべきで、状態をもつのであればそれは見えていないエンティティや値オブジェクトの存在をまず疑うとよいとおもわれる。
ドメインのクライアントならアプリケーションサービスでは?
ドメインサービスはあくまでビジネスロジックがつまっていてドメインにすべきものなのでアプリケーションサービスとは異なる。
アプリケーションサービスは、ドメインの業務を成立できるようにサポートすることを目的としているので、ここにドメインの知識をかかないようにする。