22

現時点では、CQRS とドメイン駆動設計の原則に基づく新しいアーキテクチャを構築しています。現在、外部とのコミュニケーションをどのように扱うべきかについて議論を行っています。質問をより具体的にするために、顧客が注文を作成したときに SMS 通知を送信する例を使用します。

クライアントは、関連付けられたコマンド ハンドラーによって処理される NewOrderCommand を作成します。ハンドラーは、ドメイン モデルに新しい Order オブジェクトを作成し、NewcustomerCreatedEvent を生成します。オブジェクトはイベント ストアに保存され、イベントはすべてのリスナーに発行されます。

ここまでは順調ですが、ここで質問です。SMS 通知はどこに送信すればよいですか?

私たちの最初の本能は、NewCustomerCreatedEvent をリッスンしてメッセージを送信するイベント リスナーを使用して送信する必要があることを教えてくれました。このアプローチの問題点は、SMS の送信もビジネス ロジックの一部であることです。私たちはホストされたサービスを販売しているので、クライアントは彼らに代わって送信されたすべての SMS メッセージを見ることができるはずです. メッセージの送信はドメイン外で行われるため、それを行うことはできません。

SMS ドメインを作成し、イベント リスナーが NewCustomerCreatedEvent を受け取ると、イベント ハンドラーが新しいコマンド SendSmsMessageCommand を作成します。このコマンドは、ドメイン内に新しい SMSMessage オブジェクトを作成し、SMS 通知を送信して、SmsSent イベントを作成します。見る。

最初はドメイン モデルで SMS メッセージを送信していましたが、これが問題を引き起こす可能性があることに気付きました。SMS の送信後に何かが発生し (例外がスローされ)、トランザクションがロールバックされたとします。私たちのドメインはこれを完全にサポートしているため、データに関しては問題ありませんが、SMS メッセージは既に送信されているため、コマンドが再送信されると、SMS 通知が再度送信されます。

SmSSent イベントで SMS を送信することを考えていましたが、それは少し奇妙です。イベントは、メッセージが既に送信されたと言っているのに、まだ送信されていないからです。

上記の例から、CQRS とドメイン駆動設計の概念で外部通信をどのように処理するかという疑問が生じます。SMS 通知の送信だけでなく、請求書の送信、外部請求システム、および外部世界へのその他すべての種類の通信についても話しています。これはビジネス ロジックであるため、ドメインで行うべきでしょうか、それともイベント ハンドラーのイベントに基づいて常に行うべきでしょうか? また、そうする場合、メッセージがまだ実際に送信されていないときにメッセージが送信されたことを示すイベントを使用することは許容されますか?

皆さんがすでにこの状況に対処しており、この件についてアドバイスをいただけることを願っています。

4

2 に答える 2

2

SMS メッセージのドメイン オブジェクトは必要ないと思います。顧客に送信された SMS を報告するだけですよね?SMS メッセージはどのドメイン ロジックでも使用されていませんね。

したがって、ハンドラーに SMS を送信させてから、SMS が送信されたことを示す別のイベントを発行し、イベント ハンドラーに SMS 送信メッセージをリッスンさせ、その情報を読み取りモデルで具体化して、顧客がそれらを表示できるようにします。

于 2011-06-09T20:22:43.303 に答える
0

Microsoft が呼ぶように、Saga または Process Manager を使用できます。これは基本的に、サガの状態を変更するイベントをリッスンし、サガに実装された状態ロジックに基づいてコマンドを発行します。

あなたの場合、CustomerCreatedEvent と OrderCreatedEvent の両方を待機する 2 つの状態のサガであり、通信用の特殊な境界コンテキストがある場合はコマンドを発行して SMS を送信するか、インターフェースを介してインフラストラクチャ サービスを呼び出します。 SMSを送信します。

ここでは、saga/プロセス マネージャー パターンに関する Microsoft の記事を見つけることができます。

https://msdn.microsoft.com/en-us/library/jj591569.aspx

そして、実装を含む 2 つの記事:

http://danielwhittaker.me/2015/03/31/how-to-send-emails-the-right-way-in-a-cqrs-system/

http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/

于 2015-10-12T19:47:06.590 に答える