DDD:ドメインイベントハンドラーの配置場所


13

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

回答:


11

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

ドメインイベントは、ドメインレイヤーで何かが発生したことを外部レイヤー(または外部世界)に伝える方法です。イベントをどうするかは、アプリケーションによって異なります。アプリケーションは、ユーザーに変更を通知するか、別のドメインを呼び出して何かをすることがあります。アプリケーションは、ユーザーアクション、Webリクエスト、またはドメインイベントに反応してドメイン操作を調整する役割を果たします。


1
アプリケーション層に+1。pub-sub設計では、ドメインイベントにより、さまざまな場所/システム/マイクロサービスで汎用ロジックがアクティブになる場合があります。サブスクライバーの1つがDDDを使用してモデル化されたアプリケーションである場合、イベントはそのアプリケーション/ BCで何らかの処理をトリガーします。この処理には、通常、アプリケーション層で実行されるトランザクション境界、アクセス制御、調整が必要になる場合があります。
パウロMerson

2

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

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

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

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


2

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

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

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

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

しかし、私たちは持っています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.