web-dev-qa-db-ja.com

DDD:ドメインイベントハンドラーはどこに配置しますか?

DDDにドメインイベントハンドラーを配置するのに適切なレイヤーはどれかについて、ご意見をお聞かせください。たとえば、新しい契約を追加するアプリケーションサービスがあり、契約が追加されたときに連絡先担当者にメール通知を送信したい場合は、そのメール送信者(ContractAddedイベントを処理する)アプリケーションサービスまたはドメインサービスまたは他に何か?

13
Toni

アプリケーション層にドメインイベントハンドラーを配置します。

ドメインイベントは、ドメインレイヤーで何かが発生したことを外部レイヤー(または外部ワールド)に通知する方法です。イベントをどうするかは、アプリケーションによって異なります。アプリケーションは変更についてユーザーに通知するか、別のドメインを呼び出して何かを行う場合があります。アプリケーションは、ユーザーアクション、Webリクエスト、またはドメインイベントに応じてドメイン操作を調整する責任があります。

12
Eugene Khudoy

ドメインイベントハンドラーをドメインレイヤーにドメインインターフェイスIDomainEventHandlerとして配置します。

ドメインイベントハンドラーの例は、新しいトランザクションを初期化するために(たとえば、新しいドメインコマンドをトリガーするために)特定のドメインイベントをサブスクライブするポリシーです。ビジネスの論理。

注文が確認されたため、請求書リクエストを作成する必要がある例を考えることができます。 OrderConfirmedEventというイベントが発生しました。私たちのドメインのポリシーは、このイベントをサブスクライブし、ドメインコマンドRequestInvoiceを作成し、コマンドハンドラーによって処理され、それに応じて処理されるようにします。

アプリケーションレイヤーにこのイベントハンドラーがある場合、アプリケーションレイヤーは、ユーザーのアクションの調整に加えて、いくつかのビジネスロジックを実行することになりますが、これは正しくないようです。

ただし、

2
diegosasw

オリジナルのDDDブック(Evans 2004)は、アプリケーション層を、ユーザーのアクションに応答してドメインオブジェクトを実行する薄い層として説明しています。したがって、ドメインイベントの一般的なイベントハンドラは、アプリケーション層に属していません。

上向きの依存関係を作成してレイヤーを壊さない限り、それらの一部をドメインレイヤーに配置することは意味があります。

ドメインレイヤーの下にあるインフラストラクチャレイヤーがある場合、レイヤーを壊すため、イベントハンドラーはそこに存在できません。

ドメインレイヤーの上にあるアダプターレイヤーがある場合は、そこにイベントハンドラーを作成できます。 六角形のアーキテクチャ を確認してください。

2
Gudmundur Orn