DDDでGregYoundによるこのビデオを見たことがある
http://www.infoq.com/interviews/greg-young-ddd
メモリ内に変更がある場合、DDDを使用してコマンドクエリ分離(CQS)を実装するにはどうすればよいでしょうか。
CQSを使用すると、2つのリポジトリがあります。1つはコマンド用、もう1つはクエリ用です。2つのオブジェクトグループ、コマンドオブジェクトとクエリオブジェクト。コマンドオブジェクトにはメソッドのみがあり、オブジェクトの形状を公開できるプロパティはなく、画面にデータを表示するために使用することはできません。一方、クエリオブジェクトは、画面にデータを表示するために使用されます。
ビデオでは、コマンドは常にデータベースに送られるため、クエリリポジトリを使用して、更新されたデータをフェッチし、画面に再表示できます。
CQSをASP.NETの編集画面のようなもので使用できますか?変更はメモリで行われ、変更がデータベースに永続化される前に、画面を変更で数回更新する必要がありますか?
例えば
- クエリリポジトリからクエリオブジェクトをフェッチして画面に表示します
- 編集をクリックします
- クエリオブジェクトリポジトリからクエリオブジェクトを再フェッチし、編集モードでフォームに表示します
- フォームの値を変更します。これにより、コマンドオブジェクトが自動ポストバックされてフェッチされ、関連するコマンドが発行されます。
- 何をすべきか:コマンドが計算フィールドに変更を加えたときに、更新されたオブジェクトを表示する必要があります。コマンドオブジェクトがデータベースに保存されていないため、クエリリポジトリを使用できません。また、CQSでは、画面に表示するコマンドオブジェクトの形状を公開することを意図していません。画面に表示する更新された変更を含むクエリオブジェクトをどのように取得しますか。
私が考えることができるいくつかの可能な解決策は、セッションリポジトリ、またはコマンドオブジェクトからクエリオブジェクトを取得する方法を用意することです。または、CQSはこのタイプのシナリオには適用されませんか?
ビデオでは、変更がすぐにデータベースに保持されるように見えますが、ドメインオブジェクトへの変更のバッチ処理と、変更されたドメインオブジェクトのビューの更新の問題に対処する、CQSを使用したDDDの例は以前に見つかりませんでした。最後に、ドメインオブジェクトを保存するコマンドを発行します。