それでは、通常の Order の例を見てみましょう。リッチ ドメイン モデルを仮定すると、Order.place() 呼び出しがあります。最近、このアクションに関連する追加のタスクを実行する方法は、ドメイン イベントを指しているようです。では、この呼び出しが「OrderPlaced」イベントを発生させたとしましょう。イベントが配置された後に発生する通常のことは、確認メールを送信して、このイベントのイベント リスナーを作成し、メールを送信することです。
簡単に: Order.place() > OrderPlaced イベントが発生 > EmailForOrderPlaced リスナーが起動 > メールが送信される
同様の方法で機能する登録もあります (User.register() > UserRegistered イベントが発生 > 登録リスナーが起動 > メールが送信されます)
でも:
問題 (作成されたタスク - 意味をなす必要はありません - しかし、実際のビジネス要件の多くはとにかく意味がありません):
ここで、登録と注文の機能を 1 つにまとめて提供したいと考えています。通常の登録ごとに 1 つのメールと注文用の 1 つのメールではなく、両方を含む 1 つのメールのみを送信したいと考えています。これは誇張された懸念であるため、通常はこれを行うドメイン サービスを作成しますが、User.register(); を呼び出すと、注文. 場所 (); これで、通常どおり 2 つのイベントが発生し、顧客に電子メールがスパム送信されます (そうではありませんが、これは一例です)。
では、どうすればこれを回避できるでしょうか。サービスでイベントを発生させることができるため、結合された電子メールを送信することは明らかに問題ではありませんが、それでも元の 2 つの電子メールが残ります。2 つの呼び出しを実行する前にサービス内の 2 つのリスナーをデタッチすると、実際にはそれらの機能について知る必要があり、新しいリスナーが追加されるたびに、サービスのデタッチにも戻る必要があることを意味します。など、これをシームレスに行うより良い方法はありますか?