問題タブ [domain-events]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
3609 参照

cqrs - CQRS とドメイン イベント

CQRS は私を思考モードにさせてくれました。私は CQRS のアイデアで新しいプロジェクトを始めようとしています。私が気に入っている主な点は、
1) クエリとコマンドの分離です。私たちのドメイン クエリは問題でした。
2) 監査用の Event Storage の使用 - 再生用には使用しません - 少なくとも今は。

クエリ側は得意ですが、ドメイン イベントについてはまだいくつか質問があります。

コマンドが複数の集約ルート (例: Order および OrderDetail) の更新をもたらす場合、それらを UnitofWork (トランザクション) の下でスコープします。現在、各ドメインは、その状態が変更されたときにイベントを発行する責任があります。

コマンドが 3 つの orderDetail レコードを変更するとします。各 OrderDetail は 2 つのイベントを公開します。最終的に 6 つのイベントがあります。

a) ドメイン オブジェクトに変更を加えた直後にイベントを発行する場合 (ただし、トランザクションをコミットしていない場合)、発行された (サブスクライバーによって消費された可能性がある) イベントを元に戻すにはどうすればよいですか?

  • 私が考えることができるのは、公開されるイベントを「同じ作業単位のスコープの下で」リストに保持し、トランザクションのコミットが呼び出されたら、それを保存して公開することです。これは人がすることのように聞こえますか。

b) OrderDetail の変更により、Order Aggregate ルートでも何らかの変更が行われる必要がある場合、
i) OrderDetail Aggregate によって公開されたイベントを処理することによって、これらの変更を行う必要がありますか? たとえば。2 つの注文明細が削除されたとします。これにより、注文ステータスが「優先」から「非優先」になります。ii) イベントでエラーが発生し、注文状態が更新されない場合 - 注文が引き続き優先される場合、2 日以内に発送されます。

別の質問を追加
c) 「ドメイン イベントは、すべてのアプリケーション状態変更のソース」ですか、それとも「すべてのアプリケーション状態変更の結果」ですか?

前もって感謝します、

ザ マール

0 投票する
2 に答える
2020 参照

domain-driven-design - Domain Events と ServiceBus で CQRS と DDD を使用する場合の View での変更の表示

ドメイン イベントを使用して読み取りモデルを構築するシステムのフローについて、少し混乱しています。特に、ユーザーがコマンドを完了したときにデータ (およびそのビュー) が変更されることを期待しているにもかかわらず、システム アーキテクチャ (イベントを発行するための非ブロック呼び出し) により、実際のデータベースは変更前に変更されない可能性があるという事実にどのように対処すればよいでしょうか。ページがリロードされますか?

イベントとサービス バスを使用して、システムの 1 つの設計を CQRS とより一致させたいと考えています。

私のフローが次のようになるとしましょう:

  1. ユーザーはビューのボタンをクリックして、アカウントから支払い方法を削除するタスクを実行します。

  2. コントローラーは PaymentMethodRemovalService を呼び出し、accountId と paymentMethodId を渡します。

  3. コントローラーは AccountRepository を使用してアカウントを取得し、account.RemovePaymentMethod(id) を呼び出します

  4. アカウントは操作が実行できることを検証し、イベント PaymentMethodRemovedMessage(accountId, paymentMethodId) を発行します

  5. イベント発行は非同期であるため、サービスから戻り、コントローラーからビューを返す必要がありますが、実際のデータはまだ更新されていません

  6. ハンドラー IHandle< PaymentMethodRemovedMessage > がイベントを受け取り、DB から実際の行を削除します。

それで、男は何をするのですか?

たとえば、支払い方法を表示していた div を削除するだけです。これは AJAX シナリオで機能する可能性がありますが、JavaScript 以外のクライアントをサポートするために Post-Redirect-Get を使用している場合はどうでしょう。次に、おそらく更新される前に、Get を起動し、Query 側からデータを読み取ります。

支払い方法を削除するリクエストが送信されたことを示す通知を表示するだけですか? (友好的ではないように見えますが、注文を送信するのには意味がありますが、住所の変更などには意味がありません)。

変更を分離された非同期イベントとして実装し、現在の変更を反映するユーザー データを表示する方法はありますか?

編集:私の質問はCQRS、DDD同期レポートデータベース に非常に似ています。そこに与えられた答えとここでほのめかされた答えには、少し臭いがあります-帯域外の更新を表示するためにUIを混乱させますいわば読み取りDBです。私はもう少しきれいなものを望んでいました。

0 投票する
1 に答える
1156 参照

.net - ドメイン イベント、EventHandlers、Dispatcher のどのレイヤー

私はドメイン イベントについて読んでおり、Udi の実装 ( http://www.udidahan.com/2009/06/14/domain-events-salvation/ ) や Mike Hadlow ( http://mikehadlow.blogspot. com/2010/09/separation-of-concerns-with-domain.html )、Jimmy Bogard と Jason Dentler の実装。

全体として、私はイベントのアイデアが好きです。

私の質問は、これらのコンポーネントをどのレイヤーに追加する必要があるかです。

BUS を使用するつもりはなく、すべてのイベントは同期方式で処理されます。

インターフェイス IDomainEvent 、 IEventHandler は、残りのインターフェイスが保持され、すべてのプロジェクトからアクセスされるProject.Coreに移動する必要があると思います。

Dispatcher (静的クラス) はProject.Infrastructureに入るべきだと思います。

ドメイン イベントのハンドラー専用の新しいプロジェクトを作成します。Project.EventHandlersとしましょう。

IoC (structuremap) を使用してすべてのハンドラーを登録します。

私が見ているイベント自体はビジネス言語に基づいているため、すべての集計が実装されているProject.Domainに移動する必要があると思います。

これが正しい方法かどうか教えてください。

私の他の混乱は、プロジェクトの参照に関するものです。Project.Domainは、静的なEvent Dispatcherを使用できるようにProject.Infrastructureを参照する必要があります。

Project.EventHandlersはProject.Domainを参照する 必要があります。これは、処理できるイベントが何であるかを知る必要があるためです。

Project.EventHandlersに StructureMap レジストリ クラスを作成し、Global.asax で BootStrapped する予定です。

これが以前に話されている場合は、リンクを教えてください。Google 検索では見つかりませんでした。

0 投票する
3 に答える
12414 参照

c# - ドメインイベントの例を探す

Udi Dahanドメインイベント–救済で説明しているように、ドメインイベントの実装のサンプルコードがどこにあるか知っている人はいますか?

0 投票する
2 に答える
6942 参照

architecture - ドメインイベントハンドラー-アプリケーション層の懸念事項に使用する必要がありますか?

ドメインイベントを実装する場合、イベントハンドラーは、純粋にドメインの問題にのみ使用する必要があります。あなたがビジネスの専門家と話し合う何か、またはそれらはドメインモデルに興味を持っている何かによって使用されるために開かれていますか?

これはおそらく簡単な例で最もよく説明されます。従業員に仕事をスケジュールするためのカレンダーアプリケーションを考えてみましょう。

次のドメインイベントが発生する可能性があります...

AppointmentAdded AppointmentRemoved AppointmentContentChanged AppointmentMoved

これらのイベントのハンドラーがあります。たとえば、予定が従業員の勤務時間外の時間に移動された場合、警告フラグを設定します。

もちろん、これらのイベントに関心のあるアプリケーションの懸念事項があります。たとえば、予定がカレンダーに追加された場合、後で変更をコミットできるように、それを作業単位に追加する必要があります。

これらのアプリケーションの懸念はドメインイベントの利用者である必要がありますか、それとも代わりに個別のシステムイベントを発生させて処理する必要がありますか?

0 投票する
2 に答える
3829 参照

architecture - ドメイン イベントは、トランザクション内またはトランザクション外で発生させる必要がありますか?

このアプリケーションでは、ドメイン モデルで何かが変更されたときにドメイン イベントを発生させます。イベント ハンドラーによって実行されるタスクの一部は、イベントが発生したときに使用されたのと同じトランザクション内で実行する必要があり、他のタスクはこのトランザクションの外部で実行する必要があります。

例えば、

Orderline が Order エンティティに追加されると、OrderLineAdded ドメイン イベントが発生し、1 つのドメイン イベントがドメイン モデルの状態を変更します (したがって、同じトランザクションで実行する必要があります)。トランザクションが完了すると、UI を更新する必要があります。

この問題にどのように取り組みますか?

  1. トランザクション内で 1 つ、トランザクション外で 1 つの 2 つのイベントを発生させます。
  2. トランザクション内でイベントを発生させますが、イベント ハンドラーを使用して Async 要求を送信し、UI を更新しますか?

オプション 1 は、イベント名が何らかの形でトランザクション内またはトランザクション外であることを伝える必要があるため、紛らわしいように見えますが、オプション 2 では、ドメイン イベントのハンドラーは常に、トランザクション内から同期的に呼び出されると想定する必要があります。

たぶん、より良いアプローチがありますか?

0 投票する
1 に答える
751 参照

event-handling - ドメイン イベント v イベント アグリゲーター v... その他

ドメインに複合構造があり、リーフ ノード (Allocation) に DurationChanged イベントがあり、これをプレゼンテーション レイヤー ビュー モデル構造 (TimeSheetViewModel 内) の上部で使用したいと考えています。それに到達する。

頭に浮かぶオプションは次のとおりです。

  1. TimeSheetComposite で購読します。各コンポジットは最終的に割り当てで構成され、TimeSheetComposite は TimeSheetViewModel のモデルです。子の DurationChanged イベントが発生したときに発生する TimeSheetComposite のイベントも必要になるようです。TimeSheetViewModel は後者のイベントをサブスクライブします。
  2. DurationChanged イベントを無視し、AllocationViewModel.Amount が変更されたときに TimeSheetViewModel に到達する INPC チェーンに従います。有用な情報、特に編集前の古い Amount はありませんが、必要に応じて必要な最終結果を十分に安価に計算できます。
  3. DurationChanged イベントをDomain Eventにします。私は現在ドメイン イベントを使用していませんが、コンセプトは確かに気に入っています。Udi の記事には、それを使い始めるのに十分なコードがあるようです。
  4. DurationChanged をパブリッシュおよびサブスクライブするために、ある種の Event Aggregator をセットアップします。Domain Events と Event Aggregators の違いは何なのか、同じことを解決するための補完的なアプローチなのか代替のアプローチなのか、まだよくわかりません。ここでのRx を使用した実装は有望に見えます

この設計では、TimeSheetViewModel は Allocation.Duration がいつ変更されたかを知る必要があるため、日付ごとのすべての割り当て期間の新しい合計を取得できます。

DurationChanged 通知をどのように提供しますか?

乾杯、
ベリル

ドメイン複合構造とイベント

ここに画像の説明を入力

プレゼンテーション層の構造

ここに画像の説明を入力

0 投票する
2 に答える
3656 参照

autofac - ドメイン イベントでの Autofac の使用

プロジェクトにドメイン イベントを導入しようとしています。この概念は、Udi Dahan の投稿 ( http://www.udidahan.com/2009/06/14/domain-events-salvation/ ) で説明されています。

ドメイン イベント コードは次のとおりです。

最も重要な部分は、イベントが発生したときに発生する必要があるものからドメイン イベントを切り離す IEventDispatcher 実装です。コツは、このカップリングをコンテナを通して配線することです。これが私の試みです

すべてのドメイン イベント ハンドラを登録するためのコード....

そして、ディスパッチャーですべてのイベント ハンドラーを解決します。問題は、ハンドラーが解決されていないことです。

そのため、イベント ハンドラーを正しく登録していないか、解決していません。登録が機能していることを確認するにはどうすればよいですか?

ハンドラのコード例

UPDATE いくつかの試行錯誤の後、EventDispatcherは正常に機能しています! ハンドラーを手動で登録してからドメイン イベントを発生させると、機能します。アセンブリのスキャン/登録が私の問題です。手動登録コード...

IHandleDomainEvents<>では、このように見えるすべてのアセンブリをスキャンするにはどうすればよいですか

0 投票する
6 に答える
7230 参照

asp.net-mvc - 永続性に依存するドメイン イベントをどこで発生させるか (サービス、リポジトリ、または UI?)

ASP.NET MVC3 / NHibernate アプリケーションには、ドメイン オブジェクトに関連するさまざまなイベントを起動して処理する必要があります。たとえば、OrderオブジェクトにはOrderStatusChangedやなどのイベントが含まれる場合がありますNoteCreatedForOrder。ほとんどの場合、これらのイベントによってメールが送信されるため、MVC アプリにそのままにしておくことはできません。

私は、Udi Dahan のDomain Eventsや、この種のことを行う方法についての他の多くの考えを読み、イベント メッセージを処理する NServiceBus ベースのホストを使用することにしました。私はいくつかの概念実証テストを行いましたが、これはうまくいくようです。

私の質問は、どのアプリケーション層が実際にイベントを発生させるべきかということです。問題のオブジェクトが正常に永続化されるまでイベントを発生させたくありません (永続化が失敗した場合、メモが作成されたという電子メールを送信できません)。

もう 1 つの懸念事項は、場合によっては、イベントが集約ルートの下にあるオブジェクトに関連付けられることです。上記の例では、コレクションにNote追加して順序を保存することで a が保存されます。これは、が保存されOrder.Notesたときにどのイベントを起動する必要があるかを評価するのが難しくなるという問題を引き起こします。Order更新されたコピーを保存する前に、オブジェクトの現在のコピーを取得して違いを探す必要はありません。

  • UI がこれらのイベントを発生させるのは適切ですか? どのイベントが発生したかを認識し、サービス層がオブジェクトを正常に保存した後でのみ、イベントを起動できます。コントローラがドメイン イベントを発生させると、何かがおかしいように見えます。

  • 正常に永続化された後、リポジトリはイベントを発生させる必要がありますか?

  • イベントを完全に分離し、リポジトリにオブジェクトを格納し、それEventをポーラー サービスによって取得して、NServiceBus のイベントに変換する (またはポーラー サービスから直接処理する) 必要がありますか?

  • これを行うより良い方法はありますか?オブジェクトが永続化された後にのみ、サービス層によって起動されるイベントをドメイン オブジェクトでキューに登録することはできますか?

  • 更新:私はサービス層を持っていますが、特定の集約ルートが保存されたときにどのイベントを起動する必要があるかを決定するために、比較プロセスを実行するのは面倒で過剰に思えます。これらのイベントの一部は詳細 (「注文ステータスが変更されました」など) であるため、オブジェクトの DB コピーを取得し、プロパティを比較してイベントを作成し、新しいオブジェクトを保存してから、イベントが発生したときに NServiceBus に送信する必要があると思います。保存操作が正常に完了しました。

アップデート

以下に投稿した回答(以下の方法)に続いて、私が最終的に行ったことは、ドメインエンティティEventQueueList<IDomainEvent>. 次に、ドメインへの変更に値するイベントを追加しました。これにより、ロジックをドメイン内に保持することができました。これは、エンティティ内で何が起こっているかに基づいてイベントを発生させるため、適切であると考えています。

次に、サービス レイヤーでオブジェクトを永続化するときに、そのキューを処理し、実際にイベントをサービス バスに送信します。最初は、ID PK を使用するレガシー データベースを使用することを計画していたので、これらのイベントを後処理してエンティティの ID を入力する必要がありましたが、最終的には、Guid.Combその手順をスキップできる PK に切り替えることにしました。