12

まず、長い質問で申し訳ありませんが、基本的な情報を提供する必要があります。

ASP.net MVC、JQuery テンプレート、Entity Framework、WCF を使用するアプリケーションを作成しており、ドメイン層として POCO を使用しました。このアプリケーションには、ASP.net MVC アプリケーションとデータを交換するための WCF サービス レイヤーがあり、WCF から MVC へのデータ転送オブジェクト (DTO) を使用します。

さらに、アプリケーションは、WCF サービス レイヤーで Domain-TO-DTO を変換するときに AutoMapper を使用して、Entity Framework で遅延読み込みを使用します。

バックエンド アーキテクチャは次のとおりです ( WCF Services -> Managers -> Repository -> Entity Framework(POCO) ) 。

私たちのアプリケーションでは、MVC アプリケーションに別のマッピング レイヤーが必要ないため、ビュー モデルを使用しません。また、ビュー モデルとして DTO のみを使用します。

通常、 Customer 、 CustomerLite などのドメインには Normal および Lite DTO があります ( Lite オブジェクトには Normal よりもプロパティがほとんどありません)。

現在、DTO 構造がより複雑になり、保守性 (DTO の一般的な階層構造) を考えるとパフォーマンスが低下するため、DTO でいくつかの問題が発生しています。

例えば、

次のように、カスタマー ビュー ページと DTO 階層があります。

 public class CustomerViewDetailsDTO
 {
   public CustomerLiteDto Customer{get;set;}
   public OrderLiteDto Order{get;set;}
   public AddressLiteDto Address{get;set;}
 }

この場合、このビューには OrderLiteDto の一部のフィールドは必要ありません。しかし、他のいくつかのビューはそのフィールドを必要とするため、それを容易にするためにその構造を使用します。

自動マッピングに関しては、CustomerViewDetailsDTO をマップし、遅延読み込み (Entity Framework) から追加データ (特定のビューには必要ありません) を取得します。

私の質問:

  1. 保守性を考慮しながらパフォーマンスを向上させるために使用できるメカニズムはありますか?

  2. 同じ DTO に対して、より多くのマップ ビュー ベースのマッピング関数で Automapper を使用することは可能ですか?

4

1 に答える 1

11

まず、Select N+1 の問題などを引き起こす可能性があるため、Lazy Loading を使用しないでください。

Select N + 1 は、データベースが次善の方法でアクセスされるデータ アクセス アンチパターンです。

つまり、積極的な読み込みコレクションを使用せずに遅延読み込みを使用すると、Entity Framework がデータベースに移動し、一度に 1 行ずつ結果が返されます。

JQuery テンプレートよりもはるかに高速なため、テンプレートには jsRender を使用してください: Render Bemchmark と、その使用方法に関する優れた情報を次に示します: HTML5 アプリケーションで jsRender テンプレートを使用して JavaScript コードを削減する

通常、Customer、CustomerLite などのドメインには Normal および Lite DTO があります (Lite オブジェクトには Normal よりもプロパティがほとんどありません)。

通常の DTO はおそらく ViewModel で、ViewModel は DTO に 1 対 1 でマッピングされる場合とマッピングされない場合があり、ViewModel にはビューからプッシュバックされたロジックが含まれているか、ユーザーの応答でモデルにデータをプッシュバックするのに役立ちます。DTO には何の動作もありません。その目的は、アプリケーションの層の間の呼び出しの数を減らすことです。

保守性を考慮しながらパフォーマンスを向上させるために使用できるメカニズムはありますか?

1 つのビューに対して 1 つの ViewModel を使用すれば、保守性について心配する必要はありません。個人的には、通常、基本となる抽象クラスを作成し、編集、作成、またはリストのために、そのクラスを継承し、ビューに固有のプロパティを追加します。たとえば、Create ビューには PropertyId は必要ありません (誰かがあなたの投稿を乗っ取って投稿できるため)。

同じ DTO に対して、より多くのマップ ビュー ベースのマッピング関数で Automapper を使用することは可能ですか?

AutoMapper を使用してすべてのマップを定義できますが、問題はマップがどれほど複雑になるかです。ビューごとに 1 つの ViewModel を使用すると、マップの作成と保守が簡単になります。次のように、データ アクセス コードで Automapper を使用することはお勧めできません。

AutoMapper の欠点の 1 つは、ドメイン オブジェクトからのプロジェクションによって、ドメイン オブジェクト全体のクエリとロードが強制されることです。

出典: LINQ クエリの自動投影

現在制限されている一連の拡張機能を使用して、データ アクセス コードでのマッピングを高速化できます: データ アクセス コードでの AutoMapper の使用をやめる

よろしく

于 2012-06-06T06:49:50.240 に答える