問題タブ [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.
asp.net-mvc - UdiDahanのドメインイベントでのNinjectの使用
私はMVCプロジェクトでNinjectを使用しており、UdiDahanのパターンhttp://www.udidahan.com/2009/06/14/domain-events-salvation/に従ってドメインイベントを実装しようとしています。
以下の抜粋では、「コンテナ」は、発生した特定のタイプのイベントのすべてのイベントハンドラーを解決するために使用されます。
私の質問(そして基本的なものが欠けている場合はお詫びします)は、Ninjectでこれを行う方法ですか?言い換えると:
「コンテナ」はこの静的クラスでどのように設定されますか?
コンテナ(カーネル?)を取得したら、すべてのイベントハンドラーを解決するためのNinject構文はどうなりますか(サービスモジュールに事前に登録する必要があると想定しています)?
コンストラクターインジェクションのみを使用する必要があり、そこからすべてが再帰的に解決され、Ninjectカーネルへのアクセスはノーノーであるという投稿を読み続けています。したがって、これを行う方法についてのアドバイスは大歓迎です。
記事からの抜粋
architecture - DomainEventHandler はどのレイヤーにあるべきですか?
Udi Dhahanによって提示されたドメイン イベント パターンを使用したい 私のアプリケーションには以下のレイヤーがあります。
UI -> 分散サービス -> アプリケーション サービス -> ドメイン -> データ層。
ドメイン レイヤーは、ドメイン イベントの発生を担当します。イベントの処理を担当するドメイン イベント ハンドラーは、どのレイヤーに配置する必要がありますか?
asp.net - 多層アプリケーションでドメイン イベント ハンドラーを配線する方法
したがって、私の質問はこれに非常に関連しています:リポジトリとエンティティフレームワークを使用したドメインイベント内のエンティティの永続性?
編集:このトピックに関するより良い議論もここにあります:永続性に依存するドメイン イベントを発生させる場所 - サービス、リポジトリ、または UI?
ただし、正しいアプローチを取っていると仮定すると、私の質問はかなり単純で技術的です。
次のプロジェクトがあるとします。
イベントが発生した場合 (たとえば、グループ メンバーシップが付与された場合)、次の 2 つのことを (2 つの異なるレイヤーで) 行う必要があります。
- データを永続化する (DB に新しいグループ メンバーシップ レコードを挿入する)
- 関連するユーザーへの通知を作成するには (UI 関連)
冒頭で書いた最後のリファレンスの簡単な例を取り上げます。
ドメイン層には次のコードがあります。
ベント ハンドラーが MyApplicationLayer にあると仮定しましょう (サービス レイヤーと通信できるようにするため)。次のコードがあります。
ワイヤーインはどのように行われますか? 私は構造マップを使っていると思いますが、このワイヤーインコードはどのように正確に見えますか?
distributed-system - 分散システム(DDD)のドメインイベントとコマンド
分散アーキテクチャ(クライアントサーバー)があるとしましょう。クライアント側にはServerEntityクラスがあり、クライアント側にはそのClientEntityクラスがあります。ClientEntityがServerEntityにデータを要求するだけでよいのです。私は最近DDDアプローチを学び始めましたが、実際にはドメインイベントが好きなので、それを使いました。これが、将来の実装に対する私の単純な期待です。
- ClientEntityはコマンドRequestDataCommandを作成し、それを公開します(たとえば、MessageBusを介して)
- クライアントのApplicationLayerはこのコマンドを取得し、それを接続してサーバーに送信します
- サーバーのApplicationLayerはコマンドを受信し、コマンドをMessageBusにプッシュします
- ServerEntityはコマンドを受信し、いくつかのデータを含むドメインイベントを公開します
- サーバーのApplicationLayerはこのイベントを取得し、接続してクライアントに送信します
- クライアントのApplicationLayerはイベントを受信し、コマンドをDomainEventManagerにプッシュします
- ClientEntityはイベントにサブスクライブされ、受信すると内部状態が変更されます。
上記のアプローチの欠点は、数十のコマンドクラスが作成されることです。
一方、別のオプションがあります。IRequestDataServiceのようなドメインサービスインターフェイスを作成し、ClientEntityの依存関係として作成します。したがって、コマンドクラスを作成してメッセージバスに渡す必要はありません。IRequestDataServiceから適切なメソッドを呼び出すだけです。サーバーからの応答は、前の例のようにドメインイベントとして受信されます。
2番目のアプローチの欠点は、コマンドを送信するためだけにサービスを使用することです。これは、私のビジョンでは同期操作のみを実行する必要があります。
どちらのアプローチが優れているのでしょうか。クライアントサーバー通信について正しい方法だと思いますか。
event-handling - CQRS を使用しないドメイン イベントとバージョン管理
こんにちは、結果整合性を取得する方法がわからない次のシナリオがあります。
- ユーザー 1 は、タスク ベースの UI を使用して顧客名を変更します
- アグリゲートでの App Service 呼び出し操作
- 顧客名が変更された場合のアグリゲート ファイア イベント
- bus は nservicebus を使用してメッセージを送信します
- NServicebus サービスの停止
- ユーザー 2 は集約を取得し、変更アドレスを呼び出します
- 呼び出された集計操作
- 発生したドメイン イベント
- バスに乗せられたメッセージ
- バスの再起動
- メッセージ 2 が最初にピックアップされました
- メッセージ 2 が処理され、その他の境界付きコンテキストが新しいアドレスで更新されました
- メッセージ 1 がピックアップされましたが、順序が間違っています
- 今、何が起きた
13 では、イベントで集約のバージョンを渡すと楽観的同時実行エラーが発生しますか?
その場合、Message 1 new が他のコンテキストのオブジェクトに適用されます。一貫性を維持するにはどうすればよいでしょうか。
これが、ドメインにイベントを適用することを妨げている問題です。すべてのヘルプ歓迎。
本質的なアイデアは、別のコンテキストで別の集約を更新することです。私はこれの並行性の技術にこだわっています。
コマンドハンドラやコマンドがバスにプッシュされるという意味で、イベントソーシングや CQRS は使用していません。変更したくない既存の設計があるため、非同期で発生させたいのはイベント処理だけです。
ブレア
c# - 複数のサブスクライバーのドメイン イベントの発生
ドメイン イベント パターンを調べて、この件に関する多くのリソースを読みましたが、要件を満たす適切な実装方法が見つかりません。基本的に、単純な CQRS 実装で読み取り/書き込み用のリポジトリ レイヤーをラップするサービス/ドメイン レイヤーがあります。このサービス/ドメイン層を使用する ASP.NET Mvc アプリケーションがあります。アプリケーション全体が Autofac と結び付けられており、私が実現したいのは次のことです。
サービス層で "CreateNews" を呼び出してニュース項目を作成する場合、次のようにイベントを発生させる必要があることを登録します。
これはすべてトランザクションで発生しており、保存が完了するまで実際にイベントを発生させたくないので、変更を保存するメソッドでこれを実行したいと考えています。
次に、ASP.NET Mvc アプリケーションで、次のような IHandler を実装したいと考えています。
save メソッドからこのイベントを発生させ、Web.Mvc アプリケーションで実装を呼び出す方法がわかりません。
任意の提案をいただければ幸いです。
c# - Entity Framework and ADO.NET with Unit of Work pattern
We have a system built using Entity Framework 5 for creating, editing and deleting data but the problem we have is that sometimes EF is too slow or it simply isn't possible to use entity framework (Views which build data for tables based on users participating in certain groups in database, etc) and we are having to use a stored procedure to update the data.
However we have gotten ourselves into a problem where we are having to save the changes to EF in order to have the data in the database and then call the stored procedures, we can't use ITransactionScope as it always elevates to a distributed transaction and/or locks the table(s) for selects during the transaction.
We are also trying to introduce a DomainEvents pattern which will queue events and raise them after the save changes so we have the data we need in the DB but then we may end up with the first part succeeding and the second part failing.
Are there any good ways to handle this or do we need to move away from EF entirely for this scenario?
c# - ドメイン イベント パターン シングル ポイント ツー キュー イベント
ここに質問を置きます:複数のサブスクライバーに対してドメイン イベントを発生させると、その答えにより、次のような IEventPublisher を持つことができるパターンにたどり着きました。
および IEventSubscriber は次のようになります。
これに関する問題は、次のように各パブリッシャーのインスタンスをコンストラクターに渡す必要があることです。
私が理想的にできることは、IEventPublishers を含むジェネリック パブリッシャーを持つことで、次のようなものを呼び出すことができます。
この例のように T を ThingyChangedEvent として定義せずに IEventPublisher のコレクションを渡すことはできないため、これを行う方法を理解できませんが、汎用パブリッシャーに渡されるタイプに基づいてパブリッシャーを決定する必要があります。 .
どんな提案でも大歓迎です。
編集:
以下の回答とここからの情報を使用してOK :http://www.udidahan.com/2009/06/14/domain-events-salvation/
public class EventManager : IEventManager { Autofac.ILifetimeScope _container;
}
これで、autofac によって解決されたコンストラクターで IEventManager eventManager のインスタンスを取得し、次のように呼び出すことができます。
このソリューションについて私が気に入らない点は次のとおりです。
コンストラクターで ILifetimeScope のインスタンスを取得したくありません。IEventSubscribersProvider のコレクションを取得できるようにしたいのですが、次のように要求すると、autofac はこれを解決しません。
タイプをパブリッシュに渡して呼び出す場合にのみ解決できます。
2 番目の問題は大した問題ではありませんが、次のように型を渡さずに publish を呼び出せると便利です。
これら 2 つの問題、特に問題 1 を解決する方法について何か提案があれば、別のプロジェクトで Autofac に依存するのは好きではないので、私は思います。私が思いつくことができる唯一のものは、次のように明示的に必要なものを取るある種のマネージャークラスです:
ご提案いただきありがとうございます。
編集2
多くの調査を行い、実行時にこの Autofac Generic Service の解像度を調べた後、私が望むことを達成できるかどうかはわかりません。私が思いつく最善の解決策はこれです:
次に、EventManager にコンストラクターで IEventSubscribersProviderFactory を取得させ、そのプロジェクトから Autofac への依存関係を削除します。
今のところこれで行きますが、長期的にはより良い解決策が見つかることを願っています.
nosql - nosql ストレージでの集計とドメイン イベントの使用
私は実際にDDDとNoSqlフィールドをさまよっています。私は今疑問を持っています: 集計からイベントを生成する必要があり、NoSql ストレージを使用したいと考えています。しかし、イベントがストレージに保存され、集約ルートの変更がトランザクションを持たないことをどのように確認できますか? それは理にかなっていますか?イベント ソーシングやトランザクション データベースを使用せずにこれを行う方法はありますか? 実際、私は 2 フェーズ コミット アルゴリズムの実装を検討していましたが、パフォーマンスの観点からはかなり重いようです...問題に間違った方法でアプローチしていますか? 質問がいっぱいです...すべての提案に感謝します エンリコ
PS私はstackoverflowの初心者なので、提案/批評家/ ...は大歓迎ですエンリコ
編集 1
何かが起こったことを集約に通知するイベントが必要であり、変更に反応する必要があります。このようなイベントがビジネス ロジックにとって重要な場合に、問題が発生します。私が理解している限り、一晩考えた後、nosqlストレージを使用してそのようなことを行うことはできません。説明させてください (大きな声で考えます:P):
- ESあり(1stシーナリー):データの「差分」を保存します。次に、それに関連付けられたイベントを生成します。2操作。
- ESあり(2ndシーナリー):データの「差分」を保存します。プロセス、ES を監視し、イベントを生成します。しかし、私は、イベントの正しい順序付けを確実にするために、ウォッチャー プロセスを 1 つだけ持つことに縛られています。
- ES (3d シーナリー) あり: べき等イベント。イベントは状態によって推測でき、イベントを再適用するたびに、コンシューマーに 1 回だけ変更を加えることができ、複数の「デキュー」プロセスを持つことができ、重複が発生する可能性はありません。1 操作ですが、消費者に大きな制限をもたらします。
- 一般的に: 集計のデータを保存します。次に、それに関連付けられたイベントを生成します。2操作。
ドメインイベントがビジネスプロセスの基本的な部分である場合、ドメインイベントとnosqlを操作することは可能ですか? 同じパフォーマンスを得るためにかなり多くのマシンを追加する必要があるとしても、それはリレーショナルに移行するためのより良いオプションになると思います。
編集 2完全を期す ために、Google で「ドメイン イベント nosql べき等」を検索します。