CQRS では、コマンドとクエリを分離します。私が理解しているように、コマンドはエンティティの状態を変更する可能性のあるドメイン イベントを発生させ、クエリはビュー固有の DTO をデータ ストアから直接返します。この記事によると、UI はコマンド バスを介してコマンドを作成します。このコマンドは、それぞれの CommandHandler によって処理されるコマンドを作成し、ドメイン ロジックを調整してドメイン イベントの発生を判断し、状態の変更をリポジトリに永続化/公開します (オプションでイベントを使用)ソーシング)。永続化された後、状態の変更はクエリを通じて利用できます。
では、コマンドが作成したエンティティがすぐに永続化/公開されない場合はどうなるでしょうか? まず、まだ永続化されていない Entity はどこに保持されているのでしょうか。コマンド バス、コマンド ハンドラー、リポジトリにあるのか、それとも新しいシン アプリケーション レイヤーに保持する必要があるのか? クエリはどのようにアクセスする必要がありますか?
ここでの問題は、CQRSが作成時にすべてのエンティティを永続化することを要求しない限り、永続化されていないエンティティのクエリが永続化されたエンティティのクエリと大きく異なるように見えることです。これは、IMO が必ずしもすべてのドメインと互換性があるとは限りません。
具体的には、さまざまなトレーニング セッションのトレーニング情報を記録するソフトウェアを構築しようとしています。ただし、トレーニング セッションが作成時に常に保存されるのではなく、[セッションの保存] ボタンを使用して手動で保存されるようにしたいと考えています。データ ストアにない場合、StartNewTrainingSessionCommand が新しいトレーニング セッションをどこに保存して、クエリできるようにするのかわかりません。