2009-09-25 11 views
6

どのようにメモリの変更でCQSを実装するのですか?

http://www.infoq.com/interviews/greg-young-ddd

DDD

にグレッグYoundすることにより、この動画を見た私は、メモリの変更を持っているときに、DDDとコマンドクエリ分離(CQS)を実装する方法不思議でしたか?

CQSには、コマンド用とクエリ用の2つのリポジトリがあります。 コマンドオブジェクトとクエリオブジェクトの2つのオブジェクトグループだけでなく、 コマンドオブジェクトにはメソッドだけがあり、オブジェクトの形状を公開する可能性のあるプロパティはなく、画面にデータを表示するために使用することはできません。 一方、照会オブジェクトは、画面にデータを表示するために使用されます。

ビデオでは、コマンドは常にデータベースに送られるため、クエリリポジトリを使用して更新されたデータを取得し、画面に再表示することができます。

CQSをASP.NETの画面のように編集して、メモリに変更が加えられ、変更がデータベースに永続化される前に何度か更新する必要がありますか?例えば

  1. 私は、クエリオブジェクトリポジトリからクエリオブジェクトを再フェッチし、それを表示し、私が編集
  2. をクリックし、クエリリポジトリからクエリオブジェクトを取得し、画面
  3. 上に表示フォームを編集モードで編集する
  4. フォームの値を変更して自動ポストバックし、コマンドオブジェクトを取得して関連するコマンドを発行します。
  5. 実行する内容:計算されたフィールドに加えられたコマンドとしてのtedオブジェクト。コマンドオブジェクトはデータベースに保存されていないため、クエリリポジトリを使用することはできません。 CQSでは、コマンドオブジェクトの形状を公開して画面に表示するつもりはありません。更新された変更を画面に表示するために、クエリーオブジェクトをどのように戻すのですか。

考えられる解決策のいくつかは、セッションリポジトリを持つか、コマンドオブジェクトからクエリオブジェクトを取得する方法です。 CQSはこのタイプのシナリオには適用されませんか?

ビデオの変更はすぐにデータベースに保存され、ドメインオブジェクトへの変更を一括変更してビューの更新を行うCQSのDDDの例は見つかりませんでした。最終的にドメインオブジェクトを保存するコマンドを発行する前に、ドメインオブジェクトを変更します。

答えて

1

本当にこのためにCQSを使用する場合は、クエリリポジトリと書き込みリポジトリの両方に同じバッキングストアへの参照があるとします。通常、この参照は外部データベースを介して行われますが、あなたの場合はリスト<T>またはこれに類するものである可能性があります。

+1

返事をありがとう。 私は、変更がメモリに保存されているときにCQSを使用するのがどのように共通しているのか、まあまあ良いのだろうかと思います。 これは基本的に、セッションリポジトリを使用してクエリリポジトリがセッション変数を介してコマンドデータにアクセスできるようにすることです。 後でHttpContextリポジトリが必要な場合があります。 誰もこれを以前に実装したことがありますか?考えは高く評価されました。 – Ian

+0

私の意見では、データソースを操作するために使用するメソッドは、データソースの種類に頼ってはいけません。リポジトリパターンを使用すると、これらの相違点を抽象化することができ、任意のデータソースをクエリー可能なオブジェクトのコレクションであるかのように扱うことができます。理論的には、「InMemoryRepository」と「DatabaseRepository」を持っているか、何を持っているのかは、個々のリポジトリの実装に依存します。 –

+0

はい、私はあなたがデータベースリポジトリ用のInMemoryリポジトリを交換できることを理解しています。 CQSの価値の一部は、データベースにコマンドを発行し、更新されたデータをクエリリポジトリで個別に取り戻すことです。メモリ内でコマンドオブジェクトはセッション中であるため、クエリリポジトリはコマンドオブジェクト内のデータのみを引き出すことができます。データベースのバージョンでは、クエリオブジェクトはコマンドオブジェクトとはまったく異なることがあります。メモリCQSとの関係がはるかに近いと思われます。これがどのようにCQSが達成しようとしていたかを知りたい – Ian

0

メモリには通常Observer design patternが使用されます。

実際には、このパターンを使用したいと思っていますが、ほとんどのデータベースでは、DB内の何かが変更されたときにアプリでメソッドを呼び出す効率的な方法はありません。

+0

わからないを提供します。 CQSでは、読み込みを書き込みから分離しています。 QueryリポジトリーがWriteリポジトリーとは別の場所。 ドメインエンティティをリポジトリに保存しないと、クエリリポジトリはどのようにデータを取得できますか? 更新された状態のドメインオブジェクトからクエリオブジェクトを取得する方法が必要ですか、またはクエリオブジェクトがドメインオブジェクトを観察して自身を更新すると言っていますか? または、セッションリポジトリを導入する可能性がありますか? – Ian

0

からのデザインパターンPatterns of Enterprise Application Architectureは、CQSと非常によく似ています。基本的には、データベースにデータを保持する大きなコマンドです。

+0

リンクをありがとうが、まだ私の質問に答えることはありません。 基本的にCQSには、メソッド(コマンド)だけのオブジェクトと、オブジェクトの形状を含むオブジェクトがあります。 コマンドオブジェクト用とクエリオブジェクト用の2つのリポジトリがあります。 コマンドオブジェクトを使用して画面を再投入するのではなく、クエリオブジェクトを使用します。 コマンドオブジェクトの変更をデータベースに保存せずに、コマンドを呼び出して行った変更をどのように再表示しますか? 変更がデータベースにないため、クエリリポジトリを使用することはできません。 – Ian

3

ここで、もっと細かいコマンドが必要なように思えます。

EG:ユーザーがウェブページとやりとりします(ショッピングカートでチェックアウトするとします)。

情報を取得している複数のページがコマンドを作成しています。ユーザが実際にのすべての情報がドメインへの単一のコマンドで送信される場所をチェックアウトするまで、コマンドは送信されません。これを "CheckOut"コマンドと呼びます。

プレゼンテーションモデルは、このタイプの相互作用を抽象化するのに非常に役立ちます。

これが役に立ちます。

グレッグまた

+0

こんにちはGreg、 この例がありますか? 私はクエリオブジェクトを取得し、ポストバック(セッションも使用できる)間の変更を許可するクエリオブジェクトをシリアライズする「ショッピングカート」オブジェクトに入れています。 オブジェクトの更新が終了すると、オブジェクトはコマンドオブジェクトに渡されます。 私は時間があれば、プレゼンテーションモデルのような編集変更にこれらを保存するために、クエリオブジェクト以外のオブジェクトを使用することができます。 同じオブジェクトを使用して表示および編集していますが、これは提案したプレゼンテーションモデルと同じですか? ありがとう – Ian

1

あなたの懸念の残りのためCQRSとは対照的に、...

これらは、より多くのように、最終的な一貫性と懸念しています。最終的にCQRSと一貫性を持たせる必要はありません。コマンドの処理をレポートストアに書き込むことも、同じ方法で同じ物理ストアを同じ方法で使用することもできます。私は、基本的なアーキテクチャーとしてこれを行い、後で必要に応じて、それに関連するコストがあるので、最終的な一貫性を導入することを実際に人々に勧めます。あなたは私の質問を得れば

+0

これは私の状況にはまだ、1つだけのデータベースを持っているので、レポートストアの更新を心配する必要はありませんし、コマンドオブジェクトはNHibernateを使用するので、変更はデータベースに保持されます。 これは私の状況に当てはまりますか?あなたがどこに関係しているかわからないのですか? – Ian

-2

JdonFrameworkがCQRS DDDのJavaフレームワークであり、それは、ドメインイベント+非同期パターン、詳細https://jdon.dev.java.net/

関連する問題