【設計】アプリケーションサービスについて
はじめに
今回はアプリケーションサービスについて書いていきます。
アプリケーションサービスはドメインを表したオブジェクト(ドメインオブジェクト)を扱い、アプリケーションとして動作するものです。
ドメインでエンティティや値オブジェクトを作っても、それらを使うような処理がないとアプリケーションとして意味がありません。
そのような処理を行うものをアプリケーションサービスと言います。
アプリケーションサービスについて
アプリケーションサービスは、ドメインオブジェクトを使って、それらを操作して、アプリケーションとして動作するためのものです。
ユーザ登録機能などで必要になるドメインオブジェクトについて考えてみると
エンティティ: ユーザ
値オブジェクト:ユーザ名、年齢、住所など
リポジトリ:ユーザ保存、参照、削除
のようなものがあります。
これらを使用してユーザ登録機能のユースケースを作っていきます。
ユーザをインスタンス化
リポジトリでユーザを保存
このように実際にアプリケーションで必要となる処理が書かれているものがアプリケーションサービスです。
アプリケーションサービスでは、ドメインオブジェクトの振る舞いを呼び出します。
ドメインオブジェクトの振る舞いは、アプリケーションサービス内で使用できます。
ただ、ドメインオブジェクトがアプリケーションサービス外で使われるような処理を書いてしまうとドメインの変更の際に、アプリケーションサービスやドメインオブジェクト外にも変更が発生するようになってしまいます。
これらを防ぐために、アプリケーションサービスのメソッドが提供する値をDTO(Data Transfer Object)に詰め替えるということがあります。
DTOは関連するデータを保持するクラスで、保持しているデータの設定、取り出しが行えます。そしてこれをやり取りのオブジェクトとして利用します。
ex) UserData(DTO) : ID(int), 名前(String) , 住所(String), 電話番号(String)
アプリケーションサービスでドメインオブジェクトを取得して、その中身をDTOに詰め替えて、アプリケーションサービスを呼んでいる箇所にDTOを返すようにします。
そうすると、ドメインオブジェクトではなくDTOを外に渡すので、ドメインオブジェクトの流出を避けることができます。(DTOの中身は、int, Stringのフィールド)
おわりに
今回はアプリケーションサービスについて書きました。
ドメインオブジェクトだけだと、どのようにアプリケーションが動くのかわかりにくいですが、アプリケーションサービスがあるとシステムの処理についてイメージしやすいなと思いました。