どのようにコマンドはクエリの分離がとうござ実装を使用する場合はORM?

StackOverflow https://stackoverflow.com/questions/1295686

  •  18-09-2019
  •  | 
  •  

質問

その原理をりがとうござ建築パターンでは個別のご照会およびコマンドを入れている。理想的には、粘り強さ店舗での読み書きで仕切られ、私の場合、ロットがありますので、正規化したデータベースです。

を使用している場合には、これはORM(設定によりどちらのモ私の場合)このORMる場合に使用を行っています。その一方で、すべてのクエリを実行する必要があります形状データ(DTOs)ユーザーの画面で共通した慣習に溝のORMうにクエリー側のりがとうござ?

き場所等の実施私のお問い合わせのDTO。直線ADO.NET (datareaders,dtos,datatables、保存procs)?一部のクエリでは極めてユニークな多くの参加を引きます。いdenormalizeのデータベースのクエリが、私のような景色(不人denormalization).

役に立ちましたか?

解決

私はCQSによって仮定していますが、意味DDD建築パターン別名<のhref =「http://codebetter.com/blogs/gregyoung/archive/2009/08/13/command-query-separation.aspx」のrel = "noreferrer"> CQRS のではなく、厳密に伝統的な CQS の原則。

私はまだあなたの読出し専用モデルのためにNHibernateはを使用すると思います。 DBのchattinessを最適化するなど、将来のマルチクエリ、遅延/積極的なロードなどなど、多くの利点があります...。 UIは、基本的にWHERE句を変更するユーザーに対して許可する場合また、ORMでクエリを作成することが容易になります。

技術的には、読み取り専用モデルをどのように扱うかについて、あなたはエンティティをマークすることができます不変する NHibernateはと。あなたは、単にあなたの不変の読み取りモデルエンティティのすべてをマークすることができます。また、私は(私は100%を確認していないように私が間違っている場合誰かが私を修正してください)それはあなたが唯一のモデルを読んでために行くもう一つの選択肢であるように、あなたはNHibernateの中に突起部を更新することができないと思います。

醜いまたは不可能NHのマッピングについて:NHは、ビューとストアドプロシージャにマップすることができますので、私はあなたがする必要があるときに、これらを使用するの罰金になると思います。あなたのSQLはまだダイナミックになりますので、閲覧数は、おそらく読み取り専用のシナリオのストアドプロシージャよりも少し柔軟です。しかし、私は店の手続きにマップしたいこれらの平坦化構造のいずれかのための読み出し/書き込みが必要な場合。

他のヒント

最終的には、アイデアは、あなたが構築し、維持するためにあなたが最も簡単なクエリチャネルを作るものは何でも使うべきであるということです。あなたは、もはやデータの整合性を維持する、あるいは(大部分)の負荷を処理し、ビジネスルールを施行、アップデートを心配する必要はありません。だから、テーブルの上に、以前にはなかった多くのオプションを自由に選択できます。

しかし、NHibernateのはまだそれはもはや単なる(それは時々、コマンド側のためである)自動デフォルトだ...良いオプションになることはできません。

私たちは、それがクラスからあなたのためのテーブルを生成します素敵な機能を持っている主な理由は、(フードの下NHibernateはに基づいています)城アクティブレコードを使用することを選択しました。ここに私たちのワークフローですので、これは、私たちのために良好にフィット:まず、我々はViewModelにクラスを作成します。このクラスは、ビューのニーズに合わせて完全に形作られています。その後、我々は、Active Recordの属性をViewModelに城とそのマーク。その後、我々は、クエリ、データベース内のそのクラスの対応するテーブルを生成するために、Active Recordのを頼みます。これは、我々はすぐのViewModelクラスを提供していますクエリのデータベーステーブルを取得することが分かってきた最速の、スムーズな方法です。自動生成は、テーブルが存在する唯一の理由は、ビューを提供することであるという現実を反映している。

私たちは、コマンド部分のEFを使用している、とクエリチェーンのストレートADO.NET =>のDTO。長所:

1)SQLクエリを最適化し、高度DBストアを使用する能力は

ORM層に抽象化していない機能します

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

しかし、我々は残りの部分は、共通のEntity Frameworkのモデルに依存している、唯一の厳しい部分(検索)するための分離を使用している。

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

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

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

私は、いつまでも守り続けていきますORMの別を読み込みおよび書き込みますので混雑して待たされること(い):

設定によりどちらのモ のためのコマンドを美しくマップマドメインモデル

Dapper.net のためのクエリー-美しい地図っDTOのでfelxibility場合、クエリが複雑です。

というのにぴったりのカップルのようにハン-ソロとチューバッカ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top