そもそもアプリケーションとは利用者の目的に応じたプログラムのこと。
ドメインオブジェクトがドメインのコード上の現身なのに対し、アプリケーションサービスは、ドメインオブジェクトを問題を解決できる形にまとめ上げたものになる。
逆に言えば、ドメインオブジェクトだけでは問題は解決できない。
結果となるドメインオブジェクトをそのまま外部に返して良いのか?→判断次第でダメとかはない。
ただ、ドメインオブジェクトを返す選択をした場合に、そのドメインオブジェクトに定義されている振る舞いを呼び出し元で利用できてしまう危険性がある。これを意図していない場合には不具合が発生するかもしれない。(e.g. ドメインオブジェクト「ユーザー」に名前を変更するメソッドが生えている場合、外部コンテキストで名前が知らず知らずに変わってしまう、など)
↑この振る舞いを呼び出すのは、当該ドメインオブジェクトが所属しているコンテキストのアプリケーション内の責務のはずなので、まずい。アプリケーションサービスとして提供されるはずの機能が各所に散ってしまう可能性がある、ということ。
そこで、ドメインオブジェクトを外部に公開せずDTOを用意する方針がある。
あくまでアプリケーションサービスはドメインオブジェクトの組み合わせ方法に注力するべきで、ドメインの知識を記載するべきではない。記載してしまうと、サービスを作るたびに同じようなドメインのルールが複数のサービスに点在することになってしまう。
サービスは直接サービス自体のふるまいを変更する状態でなければ持って良い。(e.g. リポジトリなど)インスタンス側がサービスの状態を気にしなければならないような状態は持ってはいけない。