問題タブ [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.
module - DDD: ドメイン イベントを配置する場所
Vernon の著書「Implementing Domain-Driven Design」を読みました。私が見つけられなかったのは、ドメイン イベントのクラスを配置する場所です。
- 集約と同じ名前空間に?
- のようなサブモジュールで
<aggregate-namespace>.Events
? - またはハイブリッド: 同じ名前空間だが物理
Events
サブディレクトリ
それは大きな問題ではありませんが、何人かが何をし、どのように機能したかを知ることは素晴らしいことです.
前もって感謝します!
oop - ドメイン イベントのイベント リスナーを切り離しますか? または、特定のユースケースで必要なポストイベントの実行を停止する方法
それでは、通常の Order の例を見てみましょう。リッチ ドメイン モデルを仮定すると、Order.place() 呼び出しがあります。最近、このアクションに関連する追加のタスクを実行する方法は、ドメイン イベントを指しているようです。では、この呼び出しが「OrderPlaced」イベントを発生させたとしましょう。イベントが配置された後に発生する通常のことは、確認メールを送信して、このイベントのイベント リスナーを作成し、メールを送信することです。
簡単に: Order.place() > OrderPlaced イベントが発生 > EmailForOrderPlaced リスナーが起動 > メールが送信される
同様の方法で機能する登録もあります (User.register() > UserRegistered イベントが発生 > 登録リスナーが起動 > メールが送信されます)
でも:
問題 (作成されたタスク - 意味をなす必要はありません - しかし、実際のビジネス要件の多くはとにかく意味がありません):
ここで、登録と注文の機能を 1 つにまとめて提供したいと考えています。通常の登録ごとに 1 つのメールと注文用の 1 つのメールではなく、両方を含む 1 つのメールのみを送信したいと考えています。これは誇張された懸念であるため、通常はこれを行うドメイン サービスを作成しますが、User.register(); を呼び出すと、注文. 場所 (); これで、通常どおり 2 つのイベントが発生し、顧客に電子メールがスパム送信されます (そうではありませんが、これは一例です)。
では、どうすればこれを回避できるでしょうか。サービスでイベントを発生させることができるため、結合された電子メールを送信することは明らかに問題ではありませんが、それでも元の 2 つの電子メールが残ります。2 つの呼び出しを実行する前にサービス内の 2 つのリスナーをデタッチすると、実際にはそれらの機能について知る必要があり、新しいリスナーが追加されるたびに、サービスのデタッチにも戻る必要があることを意味します。など、これをシームレスに行うより良い方法はありますか?
domain-driven-design - DDD での 2 つの境界付きコンテキスト間の通信
ドメイン内にいくつかの異なる境界コンテキストがあります。CRUD 操作の検証は、各 Bounded Context に組み込まれています。
たとえば、作成者がグループ リーダーである場合にのみ、GAME というエンティティを作成できます。
この例では、境界付けられたコンテキスト (BC) が 2 つあります。1 つはGame BCで、もう1 つはUser BCです。この問題を解決するには、ゲーム BCで、ゲームの作成に進む前に、ユーザー BCに対してIsGroupLeader()などのドメイン サービス呼び出しを行う必要があります。
このタイプの通信は、DDD によって推奨されているとは思いません。Game BCにもUser エンティティを含めることができますが、同じUser エンティティが別の BC の別のコンテキストで異なる方法で使用されているため、使用したくありません。
私の質問は次のとおりです。
Game BCがUser BCにイベントを送信してUser のステータスを尋ねる場合、ドメイン イベントを使用する必要がありますか? このアプローチでは、 IsGroupLeader のような同期呼び出しを行わず、is_group_leaderというイベントを呼び出します。次に、ゲーム BC は、ユーザー BC がイベントを処理してステータスを返すまで待機する必要があります。ゲーム BC は、ユーザー BC がイベントを処理した後でのみ、ゲーム エンティティを作成します。
CQRS は私の問題の解決策ですか?
どんなアイデアでも大歓迎です。
concurrency - ドメイン イベントをいつ使用するか
DDD では、いつドメイン イベントを使用すればよいのでしょうか? ドメイン イベントを使用するのに適したシチュエーションの推奨事項はありますか? 最終的に一貫性が許容される場合のみですか?
Product、Order、OrderLine を含むオンライン ストアの例で、1 つの Order に複数の OrderLine が含まれているとします。1 つの OrderLine は Product と 1 対 1 の関係にあり、注文を作成すると同時に、Product で使用可能な金額を差し引く必要があります。私が知っている2つの方法があります:
OrderService (アプリケーション サービス) では:
- 新しい注文を作成し、データベースに挿入します
- Order の各注文明細について、その OrderLine に関連付けられた Product を取得し、Product.UpdateQuantity() を呼び出します。
- すべての製品をデータベースに保存
- 注: 私には、アプリケーション サービスがここでほとんどの作業 (注文の作成、製品の取得、製品の更新) を行っているように思えますが、これは許容できますか?
OrderService:
- 新しい注文を作成し、データベースに挿入します
- イベント OrderCreated を生成する
- トリガーされたイベント ハンドラー、Product.UpdateQuantity() を呼び出す
- 注: 商品の数量はすぐに更新されるとは限りません
実生活では、どちらの方法がより好まれますか? どちらの場合も、製品数量の同時更新を処理する方法は? 数量がチェックアウト画面を表示した時間と異なる場合、ユーザーに失敗を通知しますか?
どうもありがとう
entity-framework - ドメイン イベント (Udi スタイル) とサービス レイヤー パターンの回避策の試行
AutoFac、CommonServiceLocator、および Udi のドメイン イベント ( http://www.udidahan.com/2009/06/14/domain-events-salvation/ ) を使用した実用的なソリューションがあるという事実に関して、微妙な問題があります。Autofac に MVC ブートストラップで ServiceProvider を設定させました。しかし、私を悩ませていることが 2 つあります。1) ドメイン イベントは、CommonServiceLocator を使用する静的メソッドを介して発生します。これにより、単体テストが難しくなり、また、私が好んで使用する Autofac 機能のいくつかが隠されます。これにより、... 2) 私のイベントは、T が DomainEvent である IEventSubsriber によって消費されます。しかし、シナリオとしては、1 つのイベントに複数のサブスクライバーがいるのが好きです。つまり、イベントを発生させると、複数のサブスクライバーを取得できます。
しかし、AutoFac を使用して、このサブスクライバー インスタンスにメタデータをタグ付けしました。
MetaData クラスは次のとおりです。
それで質問です。どうにかしてAbstract Factory(1を解決しないでください)を使用して、問題を別の場所に移動するだけです)、AutoFac Delegate Factory(Func <> Genericsにはあまり満足していません)、または単純な注入を実現したいと思いますDomainEventDispatcher に?
私を殺しているのは、Domain.Core アセンブリの依存関係を避けたいということです。今日、私は CommonServiceLocator に依存していることを知っています。しかし、基本エンティティ クラスで DI を使用する (それがもたらすもの) 簡単な方法はわかりません。AutoFac が NHibernate Interceptors を介して DomainEventDispatcher をエンティティに挿入し、Up/Down 中にイベントをディスパッチして永続化できる Nicklas Blumhardt のデモを見たことがあります。きちんとした解決策。しかし、私は Entity Framework 5 を使用しており、より簡単な解決策を望んでいます。
いくつかの答えを見るか、少なくともこのトピックについて話し合うことを楽しみにしています。この問題に近づくと立ち止まる人が多いと思います。そしておそらく - 「OK、イベントのためだけにCSLを使用します」とユニットテストの境界も作ります。- 「イベントの単体テストをスキップします」。それはここでは問題ではありません:)
/よろしくマグナス
c# - この特定の問題に対する Autofac 登録テクニック
私はこのクラスを持っています:
このIEventContainer
ような外観:
これは、次のようなIEventContainer
クラスで使用されます。DomainEvents
私の目的はDomainEvents.Container
、すべてのハンドラーが解決されるように登録することです。
Autofacでこれを行う方法は何ですか?