問題タブ [cqrs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nhibernate - ORM を使用する場合、Command Query Separation (CQS) はどのように実装されますか?
CQS アーキテクチャ パターンの背後にある原則は、クエリとコマンドを個別のパスに分けることです。理想的には、永続ストアを読み取り/書き込みでパーティション分割できますが、私の場合は、単一の正規化されたデータベースがあります。
ORM (私の場合は NHibernate) を使用している場合、コマンドを発行するときに ORM が使用されることは明らかです。しかし、ユーザー画面のデータ (DTO) を整形するために実行する必要があるさまざまなクエリはどうですか? CQS のクエリ側を実行するときに ORM を捨てるのは一般的なことですか?
クエリと DTO プロジェクションはどこに実装すればよいですか? ストレート ADO.NET (データリーダー、dtos、データテーブル、ストアド プロシージャ)? 一部のクエリは非常にユニークで、すべてをまとめるために多くの結合が必要です。クエリのためにデータベースを非正規化したくありませんが、ビューを作成することはできます (貧弱な非正規化)。
domain-driven-design - メモリ内の変更でCQSを実装する方法は?
DDDでGregYoundによるこのビデオを見たことがある
http://www.infoq.com/interviews/greg-young-ddd
メモリ内に変更がある場合、DDDを使用してコマンドクエリ分離(CQS)を実装するにはどうすればよいでしょうか。
CQSを使用すると、2つのリポジトリがあります。1つはコマンド用、もう1つはクエリ用です。2つのオブジェクトグループ、コマンドオブジェクトとクエリオブジェクト。コマンドオブジェクトにはメソッドのみがあり、オブジェクトの形状を公開できるプロパティはなく、画面にデータを表示するために使用することはできません。一方、クエリオブジェクトは、画面にデータを表示するために使用されます。
ビデオでは、コマンドは常にデータベースに送られるため、クエリリポジトリを使用して、更新されたデータをフェッチし、画面に再表示できます。
CQSをASP.NETの編集画面のようなもので使用できますか?変更はメモリで行われ、変更がデータベースに永続化される前に、画面を変更で数回更新する必要がありますか?
例えば
- クエリリポジトリからクエリオブジェクトをフェッチして画面に表示します
- 編集をクリックします
- クエリオブジェクトリポジトリからクエリオブジェクトを再フェッチし、編集モードでフォームに表示します
- フォームの値を変更します。これにより、コマンドオブジェクトが自動ポストバックされてフェッチされ、関連するコマンドが発行されます。
- 何をすべきか:コマンドが計算フィールドに変更を加えたときに、更新されたオブジェクトを表示する必要があります。コマンドオブジェクトがデータベースに保存されていないため、クエリリポジトリを使用できません。また、CQSでは、画面に表示するコマンドオブジェクトの形状を公開することを意図していません。画面に表示する更新された変更を含むクエリオブジェクトをどのように取得しますか。
私が考えることができるいくつかの可能な解決策は、セッションリポジトリ、またはコマンドオブジェクトからクエリオブジェクトを取得する方法を用意することです。または、CQSはこのタイプのシナリオには適用されませんか?
ビデオでは、変更がすぐにデータベースに保持されるように見えますが、ドメインオブジェクトへの変更のバッチ処理と、変更されたドメインオブジェクトのビューの更新の問題に対処する、CQSを使用したDDDの例は以前に見つかりませんでした。最後に、ドメインオブジェクトを保存するコマンドを発行します。
domain-driven-design - CQRS および CRUD 画面
私が理解しているように、CQRS の基本的な信条の 1 つは、コマンドは動作中心であり、ビジネスまたは UL で値を持つべきであり、データ中心、つまり CRUD ではないということです。顧客の更新に集中する代わりに、CustomerHasMoved のようなコマンドがあります。特定のデータを修正するための CRUD 画面がある場合はどうでしょうか。たとえば、スペルミスのある顧客の名前を変更する必要があります。これは、ビジネスにおいてあまり価値がありません。これは、UpdateCustomer コマンドの傘下に置く必要がありますか?
domain-driven-design - CQRSでのドメインクエリ
CQRSを試しています。CustomerService(ドメインサービス)が顧客が存在するかどうかを知る必要がある検証状況があります。顧客はメールアドレスによって一意です。カスタマーリポジトリ(汎用リポジトリ)には、Get(id)とAdd(customer)のみがあります。CustomerServiceは、顧客が存在するかどうかをどのように確認する必要がありますか?
asp.net-mvc - ASP.NET MVC でクエリ責任分離 (CQRS) をコマンドする方法は?
Command Query Responsibility Segregation (CQRS)について読んでいます。これが ASP.NET MVC でどのように機能するのだろうか? 概念的にはCQRSのアイデアが得られ、「通常/一般的な」アプローチと比較して、確かにいくつかの複雑さ(イベントとメッセージングパターン)が導入されます。また、CQRS の考え方は、いくつかの点で ORM の使用に反対しています。今後のプロジェクトでこのパターンをどのように使用できるかを考えているので、CQRS を ASP.NET MVC および NHibernate と組み合わせた経験がある場合は、CQRS をよりよく理解し、ASP.NET MVC で使用するのに役立つ具体的な例をいくつか挙げてください。ありがとう!
更新: Mark のサンプル コードを調べてきました。CQRS を学習している場合は必読です。
http://github.com/MarkNijhof/Fohjin
http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young/
http://cre8ivethought.com/blog/2009/11/28/cqrs-trying-to-make-it-re-usable/
events - CQRSイベントのバージョン管理
バージョン管理
イベントが変更された場合は、そのイベントの新しいバージョンを作成し、古いバージョンを保持します。すべてのバージョンのイベントの処理でドメインコードフォームが肥大化するのを防ぐには、基本的に、イベントを以前のバージョンから新しいバージョンに変換するコンポーネントを導入し、それらをドメインに適用します。イベントはドメインで実際に発生したものであるため、ほとんどの場合、非推奨のイベントの情報は貴重です。
私はまだこの例を見つけていません。
何か助けはありますか?
domain-driven-design - CQRS-新しいレポートテーブルを処理する方法(または:イベントストアからすべての履歴をインポートする方法)
イベントストアとしてイベントソーシングを使用し、「レポートストア」として単純な(No)SQLストアを使用するいくつかのCQRSサンプル実装(Java / .Net)を調査しました。
すべて良さそうに見えますが、すべてのサンプル実装で何かが欠けているようです。
アプリケーションが本番環境に移行した後、新しいレポートストア/画面の追加を処理するにはどうすればよいですか?また、既存の(最新の)データをイベントストアから新しいレポートストアにインポートする方法は?
すなわち:
基本的なDDD/CQRS駆動のCRMアプリケーションを想像してみてください。すべての画面(実際に表示)には、独自の構造化レポートストア(SQLテーブル)があります。これらのビューはすべて、ドメインイベント(CustomerCreated / CustomerHasMovedなど)をリッスンするハンドラーを使用して更新されます。
CRMの機能の1つは、通話をログに記録できることです(PhoneCallLoggedイベント)。時間の制約により、CRMのV1でのみ通話のログ記録を実装しました(V2で実装される通話を誰が処理したかを表示および報告します)
本番環境でしばらく実行した後、顧客および営業担当者ごとにログに記録された電話の「レポート」を実装したいと考えています。
したがって、いくつかの画面(ビュー)とサポートするレポートテーブル(レポートストア内)を追加し、イベントストアですでに収集されているデータを入力する必要があります...
それは私が研究したサンプルを見ている間私が立ち往生しているところです。イベントストアから(新しい)レポートストアへの既存の(履歴)データのインポートは処理しません。
EventRepository(DomainRepository)のすべてのサンプルには、メソッド「GetById」と「Add」のみがあり、新しいレポートテーブルに入力するためにすべての集計ルートを一度に取得することはサポートされていません。
この初期データのインポートがないと、新しい画面は新しく発生したイベントに対してのみ更新されます。すでにログに記録された通話ではありません(PhoneCallLoggedイベントのレポートリスナーがなかったため)
何か提案、推奨事項はありますか?
前もって感謝します、
レムコ