7/21

ユースケースの中で使用する集約が大量な場合はユースケースの中がかなり複雑になってしまいます。そういう時はドメインサービスを利用するのでしょうか?

具体例でいうと。トラックで購入者(複数人)へ配達に出発する時の話です。
複数の商品を扱い売上を作成します。倉庫実在庫数や在庫額を減らすとかも同時にします。
消費税率(軽減税率、通常税率)や、商品売価も日付によってある程度変動します。

本当にドメインサービスを利用しないとすると数個の集約でユースケースの実現が可能なのでしょうか?

複数集約にまたがる更新を処理する場合は 1. ユースケースで複数集約を更新する 2. 複数集約を更新するドメインサービスを作る(一部操作をパッケージプライベートなどの可視性で制御できるとよい) 3. ドメインイベントを使用する 主に3択です。 1,2は概ね想定されているような実装になるかと思います。 それで問題がある場合は3の方法もあります。 具体的には ・集約ルートのエンティティは親クラスとしてAggregateRootと言ったクラスを定義し、ドメインイベントを蓄積できるようにする ・売り上げエンティティのコンストラクタの中で、「売り上げ発生イベント」を生成、蓄積 ・売り上げリポジトリにinsertもしくはupdateしたタイミングで、ドメインイベントが蓄積されているかを確認 ・そのイベントをpub/subの仕組みでアプリケーションイベントとして発火(できればフレームワークのサポートがあるのが望ましい) ・ドメインイベントをサブスクライブする仕組み(私は別集約のドメインサービスを使用します)でキャッチ ・キャッチした先で別集約の処理を行う この実装は同期か非同期化は選択できます。 この仕組みで書くと売り上げ発生時には確実にサブスクライバの処理が行われるのと、ユースケースがシンプルになるという利点があります。

スポンサーリンク

スポンサーリンク

スポンサーリンク