1

CQRS では、コマンドとクエリを分離します。私が理解しているように、コマンドはエンティティの状態を変更する可能性のあるドメイン イベントを発生させ、クエリはビュー固有の DTO をデータ ストアから直接返します。この記事によると、UI はコマンド バスを介してコマンドを作成します。このコマンドは、それぞれの CommandHandler によって処理されるコマンドを作成し、ドメイン ロジックを調整してドメイン イベントの発生を判断し、状態の変更をリポジトリに永続化/公開します (オプションでイベントを使用)ソーシング)。永続化された後、状態の変更はクエリを通じて利用できます。

では、コマンドが作成したエンティティがすぐに永続化/公開されない場合はどうなるでしょうか? まず、まだ永続化されていない Entity はどこに保持されているのでしょうか。コマンド バス、コマンド ハンドラー、リポジトリにあるのか、それとも新しいシン アプリケーション レイヤーに保持する必要があるのか​​? クエリはどのようにアクセスする必要がありますか?

ここでの問題は、CQRSが作成時にすべてのエンティティを永続化することを要求しない限り、永続化されていないエンティティのクエリが永続化されたエンティティのクエリと大きく異なるように見えることです。これは、IMO が必ずしもすべてのドメインと互換性があるとは限りません。

具体的には、さまざまなトレーニング セッションのトレーニング情報を記録するソフトウェアを構築しようとしています。ただし、トレーニング セッションが作成時に常に保存されるのではなく、[セッションの保存] ボタンを使用して手動で保存されるようにしたいと考えています。データ ストアにない場合、StartNewTrainingSessionCommand が新しいトレーニング セッションをどこに保存して、クエリできるようにするのかわかりません。

4

1 に答える 1

1

少し誤解されていると思います。コマンドは、サービス バスを介してコマンド ハンドラーに送信されます。コマンド ハンドラーは、ビジネス オブジェクトを使用して作業を行います。ドメイン イベントはビジネス (ドメイン) オブジェクトによって生成される必要がありますが、コマンド ハンドラーによって生成されることもあります。

作成されたエンティティが保存されない理由がわかりません。特定のケースでは、ドメインで許可されている場合、デフォルトの空の TrainingSession を自動的に保存し、ユーザーが [保存] ボタンを押したときに更新することができます。

このアプローチが実行できない場合は、入力データ、ほとんどのビュー モデルを一時的な場所 (セッション、データベース) に保存し、ユーザーがボタンをクリックしたときにのみコマンドを発行します。

于 2013-10-14T07:25:03.553 に答える