アプリケーションサービスとは?
ユースケースを実現するためのオブジェクトです。アプリケーションとは利用者の目的に応じたプログラムのことを指しており、ドメインオブジェクト(ドメインサービス)とは概念的には対比される概念です。
例
例えば、以下のような操作はアプリケーション固有の振る舞いになります。
- ユーザーを登録する。
- ユーザー情報を変更する。
実装
命名
「UserApplicationService」などと命名します。
レポジトリや、ドメインサービスなどをインスタンス変数として持たせます。
登録系
以下のような流れになります。
- エンティティをnewする。
- ドメインサービスの重複チェックメソッドを実行する。
- レポジトリの保存メソッドを実行する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class xxxApplicationService { private xxxレポジトリ; private xxxドメインサービス; xxxApplicationService(xxxレポジトリ、xxxドメインサービス) { xxxレポジトリ = xxxレポジトリ; xxxドメインサービス = xxxドメインサービス; } public void register(登録する値){ xxx = new XXXエンティティ(登録する値) if (xxxドメインサービス.Exists(xxx)) { 例外処理(すでにxxxは存在しています。) } xxxレポジトリ.save(xxx); } } |
取得系
- レポジトリの取得メソッド(findなど)を実行する。
集約度を上げる工夫をする。
「アプリケーションサービス」は集約度を上げて実装する場合があります。
例えば、UserApplicationServiceというのを「UserRegisterService」と「UserDeleteService」に分けるなどです。
なぜか
UserRegisterServiceでは使っているインスタンス変数があっても、UserDeleteServiceでは使っていないインスタンス変数などがあった場合に分けてあったほうがより集約度が高まります。
全て分ければ良いか?
一概にそういうわけでもありません。そのコードを取り巻く環境(将来予測など)によってはあえて集約度を下げることが正解にもなりうります。
メソッド名はどうするの?
集約度を下げている状態ではregisterや、deleteなどの名前が使えましたが、集約度を上げると命名に困ります。
基本的に以下のような名前が使われることが多いです。
- handle
- execute
- perform
この記事へのコメントはありません。