http://www.infoq.com/interviews/greg-young-ddd
DDD
にグレッグYoundすることにより、この動画を見た私は、メモリの変更を持っているときに、DDDとコマンドクエリ分離(CQS)を実装する方法不思議でしたか?CQSには、コマンド用とクエリ用の2つのリポジトリがあります。 コマンドオブジェクトとクエリオブジェクトの2つのオブジェクトグループだけでなく、 コマンドオブジェクトにはメソッドだけがあり、オブジェクトの形状を公開する可能性のあるプロパティはなく、画面にデータを表示するために使用することはできません。 一方、照会オブジェクトは、画面にデータを表示するために使用されます。
ビデオでは、コマンドは常にデータベースに送られるため、クエリリポジトリを使用して更新されたデータを取得し、画面に再表示することができます。
CQSをASP.NETの画面のように編集して、メモリに変更が加えられ、変更がデータベースに永続化される前に何度か更新する必要がありますか?例えば
- 私は、クエリオブジェクトリポジトリからクエリオブジェクトを再フェッチし、それを表示し、私が編集
- をクリックし、クエリリポジトリからクエリオブジェクトを取得し、画面
- 上に表示フォームを編集モードで編集する
- フォームの値を変更して自動ポストバックし、コマンドオブジェクトを取得して関連するコマンドを発行します。
- 実行する内容:計算されたフィールドに加えられたコマンドとしてのtedオブジェクト。コマンドオブジェクトはデータベースに保存されていないため、クエリリポジトリを使用することはできません。 CQSでは、コマンドオブジェクトの形状を公開して画面に表示するつもりはありません。更新された変更を画面に表示するために、クエリーオブジェクトをどのように戻すのですか。
考えられる解決策のいくつかは、セッションリポジトリを持つか、コマンドオブジェクトからクエリオブジェクトを取得する方法です。 CQSはこのタイプのシナリオには適用されませんか?
ビデオの変更はすぐにデータベースに保存され、ドメインオブジェクトへの変更を一括変更してビューの更新を行うCQSのDDDの例は見つかりませんでした。最終的にドメインオブジェクトを保存するコマンドを発行する前に、ドメインオブジェクトを変更します。
返事をありがとう。 私は、変更がメモリに保存されているときにCQSを使用するのがどのように共通しているのか、まあまあ良いのだろうかと思います。 これは基本的に、セッションリポジトリを使用してクエリリポジトリがセッション変数を介してコマンドデータにアクセスできるようにすることです。 後でHttpContextリポジトリが必要な場合があります。 誰もこれを以前に実装したことがありますか?考えは高く評価されました。 – Ian
私の意見では、データソースを操作するために使用するメソッドは、データソースの種類に頼ってはいけません。リポジトリパターンを使用すると、これらの相違点を抽象化することができ、任意のデータソースをクエリー可能なオブジェクトのコレクションであるかのように扱うことができます。理論的には、「InMemoryRepository」と「DatabaseRepository」を持っているか、何を持っているのかは、個々のリポジトリの実装に依存します。 –
はい、私はあなたがデータベースリポジトリ用のInMemoryリポジトリを交換できることを理解しています。 CQSの価値の一部は、データベースにコマンドを発行し、更新されたデータをクエリリポジトリで個別に取り戻すことです。メモリ内でコマンドオブジェクトはセッション中であるため、クエリリポジトリはコマンドオブジェクト内のデータのみを引き出すことができます。データベースのバージョンでは、クエリオブジェクトはコマンドオブジェクトとはまったく異なることがあります。メモリCQSとの関係がはるかに近いと思われます。これがどのようにCQSが達成しようとしていたかを知りたい – Ian