17

CQS アーキテクチャ パターンの背後にある原則は、クエリとコマンドを個別のパスに分けることです。理想的には、永続ストアを読み取り/書き込みでパーティション分割できますが、私の場合は、単一の正規化されたデータベースがあります。

ORM (私の場合は NHibernate) を使用している場合、コマンドを発行するときに ORM が使用されることは明らかです。しかし、ユーザー画面のデータ (DTO) を整形するために実行する必要があるさまざまなクエリはどうですか? CQS のクエリ側を実行するときに ORM を捨てるのは一般的なことですか?

クエリと DTO プロジェクションはどこに実装すればよいですか? ストレート ADO.NET (データリーダー、dtos、データテーブル、ストアド プロシージャ)? 一部のクエリは非常にユニークで、すべてをまとめるために多くの結合が必要です。クエリのためにデータベースを非正規化したくありませんが、ビューを作成することはできます (貧弱な非正規化)。

4

5 に答える 5

8

CQS とは、厳密には従来のCQS原則ではなく、DDD アーキテクチャ パターン aka CQRSを意味すると仮定しています。

読み取り専用モデルには引き続き NHibernate を使用します。フューチャー クエリやマルチ クエリ、レイジー/イーガー ロードなど、DB のおしゃべりを最適化する多くの利点があります。さらに、UI でユーザーが where 句を本質的に変更できるようにすると、ORM を使用してクエリを作成するのが簡単になります。

読み取り専用モデルを技術的に処理する方法については、エンティティを NHibernate で不変にすることができます。すべての読み取りモデル エンティティを不変としてマークするだけです。また、NHibernate でプロジェクションを更新できるとは思わないので、それは読み取り専用モデルとして使用する別のオプションです (100% 確実ではないので、間違っている場合は誰かが訂正してください)。

醜いまたは不可能な NH マッピングについて: NH はビューとストアド プロシージャにマッピングできるので、必要なときにこれらを使用しても問題ないと思います。SQL は引き続き動的であるため、ビューはおそらく読み取り専用シナリオのストアド プロシージャよりも多少柔軟です。ただし、これらのフラット化された構造のいずれかに対して読み取り/書き込みが必要な場合は、ストア プロシージャにマップします。

于 2009-08-18T23:20:54.713 に答える
6

最終的には、クエリ チャネルを構築および保守しやすいものを使用する必要があるという考えです。更新、ビジネス ルールの適用、データの整合性の維持、さらには負荷の処理 (ほとんどの場合) について心配する必要がなくなりました。そのため、以前はテーブルになかった多くのオプションを自由に選択できます。

しかし、NHibernate は依然として適切なオプションである可能性があります...これはもはや自動デフォルトではありません (コマンド側の場合もあります)。

Castle Active Record (内部では NHibernate に基づいています) を使用することにしました。これは主に、クラスからテーブルを生成する優れた機能があるためです。ワークフローは次のとおりです。まず、ViewModel クラスを作成します。このクラスは、ビューのニーズに合わせて完全に形作られています。次に、その ViewModel を Castle Active Record 属性でマークします。次に、そのクラスに対応するテーブルを Query データベースに生成するように Active Record に依頼します。これは、ViewModel クラスを提供する Query データベース テーブルをすばやく取得するために私たちが見つけた最も高速でスムーズな方法です。自動生成は、テーブルが存在する唯一の理由はビューを提供することであるという現実を反映しています。

于 2010-03-07T23:17:55.533 に答える
3

コマンド部分にはEFを使用し、クエリチェーンにはストレートADO.NET => DTOを使用しています。利点:

1) SQL クエリを最適化し、ORM レイヤーに抽象化されていない高度な DB ストア機能を使用する機能

2) オーバーヘッドが少ない

ただし、要件の厳しい部分 (検索) にのみ分離を使用しており、残りは共通の Entity Framework モデルに依存しています。

于 2010-01-12T11:48:38.113 に答える
1

ORM を読み書き用に分けておきたいので、以下を使用します (そして使用します):

コマンド用のNibernate - ドメイン モデルを美しくマッピングする

クエリ用のDapper.net - DTO を美しくマッピングし、クエリが複雑すぎる場合に柔軟に対応できるようにします。

ハン・ソロとチューバッカのような完璧なカップルです。

于 2016-01-21T21:36:05.653 に答える
1

データベースの読み取りとデータベースの更新に異なるアプローチを使用する必要はありません。CQS は、データ ストアを更新するコマンドは、データ ストアから状態を読み取るクエリから分離する必要があると単純に述べています。

引き続き NHibernate を使用してデータ ストアから読み取ることができますが、2 つの異なるクラスを作成してデータ アクセスをカプセル化することで、それを明確にすることができます。1 つのクラスにはデータ ストアを読み取る (クエリ) メソッドがあり、もう 1 つのクラスにはデータ ストアにコマンド (追加、更新、削除) を発行するメソッドがあります。

回避しようとしているのは、データベースからメッセージを取得し、そのメッセージをデータベースで既読としてマークするメソッドです。これは、2 つの異なるメソッド呼び出しである必要があります。状態を変更して、同じメソッドから値を返すべきではありません。

于 2009-08-18T18:53:09.373 に答える