2013-08-06 36 views
6

ドメインイベントを処理する責任は誰にありますか?アプリケーションサービス、ドメインサービス、またはエンティティ自体DDDでは、誰がドメインイベントを処理する必要がありますか?

ここで簡単な例を使用してみましょう。

店舗アプリケーションに取り組んでおり、注文業務専用のアプリケーションサービスがあります。このアプリケーションでは、Orderは集約ルートおよびそれに続くルールであり、単一トランザクション内で1つの集約でのみ動作することができます。 Orderが置かれた後、Orderに格納されます。しかし、もっとやるべきことがあります。まず第一に、在庫内で利用可能な品目の数を変更し、次にシステムの他の部分(恐らく他の有界状況)に、その特定の注文の出荷手順を開始するように通知する必要があります。すでに述べたように、トランザクション内の集約は1つしか変更できないため、別のトランザクションの一部のコンポーネントによって処理されるOrderPlacedEventの発行について考えると思います。

質問:どのコンポーネントがこのタイプのイベントを処理する必要がありますか?

答えて

6

私はしたいと思います:

1)アプリケーション層のイベントが同じ有界コンテキストで別の集計の変更をトリガーします。

2)イベントがインフラストラクチャサービスをトリガーする場合は、アプリケーション層。

電子メールが顧客に送信されます。したがって、メールコンテンツとメールのオーダーをロードし、インフラストラクチャサービスを呼び出してメールを送信するには、アプリケーションサービスが必要です。

3)イベントが別の限定されたコンテキストでいくつかの操作をトリガーする場合、私はドメインサービスを個人的に好みます。

ShippingまたはBillingの場合、ドメインサービスのインフラストラクチャ実装は、他の限定されたコンテキストを統合する責任があります。

4)イベントを複数のコンシューマに分割する必要がある場合は、インフラストラクチャ層。消費者は1)、2)または3)に行く。

私の場合、イベントが境界のあるコンテキストに対して別個の受け入れテストにつながる場合、結論はアプリケーションレイヤです。

ところで、イベントの耐久性を確保するためのインフラストラクチャは何ですか?トランザクションにイベント公開を含めますか?

+0

お返事ありがとうございます。耐久性について - 私はまだそれをどのように整理するのか分かりません。理想的には、2つのトランザクションといくつかの永続キュー(JMS?)イベントが同じトランザクション内に公開されている必要があり、メッセージが適切に配信されたことを確認し、メッセージがキューから取り出されると、このようにして、何か問題が生じた場合、イベントが再配信されることを保証することができます –

2

この種のハンドラはアプリケーション層に属します。おそらく、サポートするアプリケーションサービスのメソッドも作成するべきでしょう。これにより、別々のトランザクションを開始することができます。

関連する問題