DTO-Pattern + Lazy Loading + Entity Framework + ASP.Net MVC + Auto Mapper

asp.net-mvc automapper dto entity-framework lazy-loading

Frage

Erstens, Sorry für eine lange Frage, aber ich muss einige grundlegende Informationen geben.

Wir erstellen eine Anwendung, die ASP.net-MVC, JQuery-Vorlagen, Entity Framework und WCF verwendet, und wir haben POCO als Domänenschicht verwendet. In unserer Anwendung gibt es eine WCF Services-Schicht, um Daten mit der ASP.net-MVC-Anwendung auszutauschen. Dabei werden DTOs (Data Transfer Objects) von WCF zu MVC verwendet.

Außerdem verwendet die Anwendung bei der Konvertierung von Domain-TO-DTOs in unserer WCF-Service-Schicht Lazy Loading in Entity Framework mithilfe von AutoMapper.

Unsere Backend-Architektur wie folgt ( WCF-Services -> Manager -> Repository -> Entity Framework (POCO) )

In unserer Anwendung verwenden wir keine Ansichtsmodelle, da wir keine andere Zuordnungsebene für MVC-Anwendungen wünschen und wir nur DTOs als Ansichtsmodelle verwenden.

Im Allgemeinen haben wir Normal- und Lite-DTOs für Domänen wie Customer, CustomerLite usw. ( Lite-Objekt hat wenige Eigenschaften als Normal ).

Jetzt haben wir einige Probleme mit DTOs, weil unsere DTO-Struktur komplexer wird und wenn wir die Wartbarkeit (mit der allgemeinen hierarchischen Struktur der DTOs) denken, verlieren wir die Performance.

Zum Beispiel,

Wir haben die Customer View-Seite und unsere DTO-Hierarchie wie folgt

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

In diesem Fall möchten wir einige Felder von OrderLiteDto für diese Ansicht nicht verwenden. Aber eine andere Sichtweise benötigt diese Felder, damit wir diese Struktur verwenden können.

Wenn es sich um automatische Zuordnung handelt, ordnen wir CustomerViewDetailsDTO zu und erhalten zusätzliche Daten (die für eine bestimmte Ansicht nicht erforderlich sind) von Lazy Loading (Entity Framework).

Meine Fragen:

  1. Gibt es einen Mechanismus, mit dem wir die Leistung verbessern können, während die Wartbarkeit berücksichtigt wird?

  2. Ist es möglich, Automapper mit mehr Kartenansicht-basierten Zuordnungsfunktionen für dasselbe DTO zu verwenden?

Akzeptierte Antwort

Verwenden Sie zunächst kein Lazy Loading, da dies wahrscheinlich zu Problemen mit Select N + 1 oder ähnlichem führt.

Select N + 1 ist ein Anti-Pattern für Datenzugriff, bei dem auf die Datenbank auf suboptimale Weise zugegriffen wird.

Mit anderen Worten: Wenn Sie Lazy Loading ohne eifrig geladenen Sammlungen verwenden, wechselt Entity Framework zur Datenbank und bringt die Ergebnisse jeweils eine Zeile zurück.

Verwenden Sie jsRender für Vorlagen, da diese wesentlich schneller als JQuery-Vorlagen sind: Rendern Sie Bemchmark. Im Folgenden finden Sie einige nützliche Informationen: JavaScript-Code mithilfe von jsRender-Vorlagen in HTML5-Anwendungen reduzieren

Im Allgemeinen haben wir Normal- und Lite-DTOs für Domänen wie Customer, CustomerLite usw. (Lite-Objekt hat wenige Eigenschaften als Normal).

Ihr normales DTO ist wahrscheinlich ein ViewModel, da ViewModels DTOs möglicherweise 1: 1 zugeordnet werden kann. ViewModels enthalten häufig Logik, die aus der Ansicht zurückgedrängt wird, oder helfen, Daten als Antwort auf die Antwort eines Benutzers in das Modell zu verschieben. DTOs haben kein Verhalten und ihr Zweck besteht darin, die Anzahl der Anrufe zwischen den Ebenen der Anwendung zu reduzieren.

Gibt es einen Mechanismus, mit dem wir die Leistung verbessern können, während die Wartbarkeit berücksichtigt wird?

Verwenden Sie ein ViewModel für eine Ansicht, und Sie müssen sich nicht um die Wartbarkeit kümmern. Persönlich erstelle ich normalerweise eine abtract-Klasse, die eine Basis darstellt, und zum Bearbeiten, Erstellen oder Auflisten eriere ich diese Klasse und füge Eigenschaften hinzu, die für eine Ansicht spezifisch sind. Zum Beispiel benötigt die Erstellungsansicht keine PropertyId (da jemand Ihren Post hijacken und veröffentlichen kann), so dass nur bei Edit und List ViewModels die PropertyId-Eigenschaft verfügbar gemacht wird.

Ist es möglich, Automapper mit mehr Kartenansicht-basierten Zuordnungsfunktionen für dasselbe DTO zu verwenden?

Sie können AutoMapper verwenden, um jede Karte zu definieren. Die Frage ist jedoch, wie kompliziert die Karte sein wird. Die Verwendung eines ViewModel pro Ansicht und Ihre Karten lassen sich einfach schreiben und verwalten. Ich muss darauf hinweisen, dass die Verwendung von Automapper im Datenzugriffscode nicht empfohlen wird:

Ein Nachteil von AutoMapper ist, dass die Projektion von Domänenobjekten immer noch das gesamte Domänenobjekt abfragt und lädt.

Quelle: Autoprojektieren von LINQ-Abfragen

Sie können eine Reihe von Erweiterungen verwenden, die ab sofort begrenzt sind, um Ihre Zuordnung im Datenzugriffscode zu beschleunigen: Stoppen Sie die Verwendung von AutoMapper im Datenzugriffscode

Grüße



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow