7

CQRS を読むと、電子メール通知について多くの話があります。どこからデータを取得すればよいのか疑問に思っています。あるユーザーが他のユーザーをイベントに招待するシナリオを想像してみてください。イベントに招待されたことをユーザーに通知するために、ユーザーに電子メールが送信されます。

具体的な手順は次のようになります。

  1. CreateEvent招待するユーザーのコレクションが関連付けられたコマンドが、サーバーによって受信されます。
  2. 新しいMeeting集計が作成され、InviteUser招待されるユーザーごとにメソッドが呼び出されます。
  3. ユーザーがイベントに招待されるたびに、ドメイン イベントUserWasInvitedToEventが発生します。
  4. 電子メール通知送信者がドメイン イベントを取得し、通知電子メールを送信します。

私の質問は次のとおりです。電子メールに含める情報はどこで入手できますか?

イベントの説明とユーザー名を含めたいとします。これは CQRS なので、私のドメイン モデルでは取得できません。ドメイン オブジェクトのすべてのプロパティは非公開です。次に、読み取り側にクエリを実行する必要がありますか? それとも、電子メール通知を完全に別のサービスに移動するのでしょうか?

4

1 に答える 1

6

CQRS では、コマンドをクエリ側から分離しています。特定のイベント ハンドラーのデータを取得するには、常にクエリ側に移動する必要があります。書き込みデータベースは、ドメイン オブジェクトを構築するために必要なデータを含む別のデータベースになり、読み取り用ではなく書き込み用に最適化されます。

  1. ドメインはイベントを登録EventCreatedし、イベント ハンドラー / プロセッサに送信する必要があります。Meetingこれは、集計のコンストラクターから発生させることができます。
  2. イベント処理コンポーネントはEventCreatedイベントを取得し、イベントに含まれるデータ (つまり、イベントの ID とその名前) でクエリ データベースを更新します。
  3. ドメインはイベントを登録UserWasInvitedToEventし、イベント プロセッサに送信できます。
  4. イベント プロセッサはUserWasInvitedToEvent、クエリ ストアを取得し、必要なレポート データで更新します。
  5. 別のイベント処理コンポーネントもイベントを取得しUserWasInvitedToEventます。このプロセスはクエリ データベースにアクセスでき、電子メールの送信に必要なすべてのデータを取得できます。

クエリ データベースはレポート データベースにすぎないため、電子メールに必要なすべてのデータを 1 か所に格納する特定のテーブルを作成することもできます。

いくつかの異なるイベントを 1 つのハンドラーに統合するために (イベントが異なる時間に異なる順序で処理される可能性があると仮定して)、メッセージング バスでSagaの概念を利用できます。NServiceBus は、 Saga のをサポートするメッセージング バスの例です。この StackOverflow の質問も参照してください: NServiceBus Delayed Message Processing

于 2010-05-26T21:09:55.000 に答える