ドメイン イベントを使用することは、DDD アプリケーションの実践として広く推奨されていますが、私には扱いにくいシナリオがあります。
私は最近、新しいユーザーが作成されたときに、そのユーザーが 3 つの別々のサブシステムでも作成されることをビジネス ロジックが要求するアプリケーションに取り組んでいました。したがって、基本的にトランザクション スクリプト アプローチを使用すると、次のようになります。
public void CreateUser()
{
CreateUserInSystemA();
CreateUserInSystemB();
CreateUserInSystemC();
}
私が検討していたアプローチはドメイン イベントを使用するものだったので、エントリ ポイントは次のようになりました。
public void CreateUser()
{
CreateUserInSystemA();
}
次にCreateUserInSystemA
、ユーザーが作成されたときにドメイン イベントを発生させます。次に、そのイベントのハンドラーがシステム B でユーザーを作成し、別のドメイン イベントを発生させ、システム C でユーザーを作成する別のハンドラーが実行されます。これはすべて、DI コンテナーの登録中に設定されたため、ほとんどハードワイヤードでした。
質問は次のとおりです。
1) このアプローチはドメイン ロジックを効果的に隠しませんか? CreateUser メソッドを見て、実際に何をしているのかを確認するのは簡単ではありません。
2) (私たちの場合のように) システム A と B でユーザーを作成するだけでよい新しいワークフローができた場合はどうCreateUserInSystemC
なるでしょうか。既存のCreateUserInSystemB
実装を使用した場合、ドメイン イベントが発生し、ハードワイヤードCreateUserInSystemC
は関係なく実行されます。
このシナリオを適切な DDD の方法で処理するための最良のアプローチは何ですか? アプリケーション サービス レイヤーを使用し、両方のワークフローに 2 つの個別のメソッドを公開するだけで、フローはドメイン イベントに基づかないようにする必要がありますか?