2016-04-15 8 views
0

Im asp.net (webapi + mvc) Projekt habe ich viele dto als öffentliche Schnittstellen zu meinem BLL. Außerdem sind die meisten meiner Ansichtsmodelle den entsprechenden dtos gleich.DTO vs VM - Verwenden oder nicht verwenden?

Intelligente Bücher sagen uns, dass wir diese Art von Modellen trennen müssen, aber auf dem Projekt sehe ich keine Vorteile dieser Lösung. Nur Hunderte von nutzlosem Code mit vielen dummen Fehlern.

Also - ist es richtig, DTO als ein Ansichtsmodell zu verwenden, wo es möglich ist? Was sind die positiven und negativen Auswirkungen dieser Lösung?

Antwort

1

Ein Datenübertragungsobjekt ist nur eine Teilmenge oder eine Obermenge von Daten, die zwischen logischen und physischen Grenzen übertragen werden sollen. Sie können Verhalten nicht bereitstellen. Sie sind nur Daten.

Auf der gegenüberliegenden Seite ist ein Ansichtsmodell eine Mischung aus Daten und Verhalten, da sie die logische Seite einer gegebenen Ansicht sind.

Da DTO und VM Muster sind, die verschiedene Anwendungsfälle abdecken, können Sie nutzlose Daten und unerwünschtes Verhalten erhalten und unerwünschte Abhängigkeiten hinzufügen.

Zum Beispiel kann ein DTO sowohl in der Domänen- als auch in der Anwendungsschicht verwendet werden. Wenn Sie sowohl DTO- als auch VM-Konzepte in einer einzigen Klasse verwenden, können Sie am Ende ein Domänenprojekt zwingen, einen Verweis auf eine UI-Bibliothek hinzuzufügen, um es erstellen zu können. Ich würde das so weit wie möglich vermeiden.

Zusätzlich Sie wissen, dass es ein objektorientiertes Konzept Erbe genannt, die Sie hier, um helfen kann, trocken zu bleiben (nicht selbst wiederholen):

public class Base {} 

public class Dto : Base {} 
public class ViewModel : Base {} 

Zusammenfassend kann man Teilen Sie, was DTO gemeinsam ist, und betrachten Sie Modelle mit Vererbung und vermeiden Sie Code-Wiederholungen.

+0

Wie wäre es mit 'DTO' ** als ** Basisklasse? Einfache VM-Casting auf Basisklasse erzeugt DTO (keine Notwendigkeit, irgendetwas zu kopieren). – Sinatr

+0

@Sinatr Da ich ortodox bin, möchte ich die folgende Aussage nicht zu einer Wahrheit machen: 'if (vm ist Dto)': \ –

0

Thx zu Matías Fidemraizer für seine ausführliche Antwort. Außerdem habe ich mehrere praktische und notwendige Anwendungen gefunden.

Wenn Sie VM als separate Einheit verwenden, fügen Sie einen zusätzlichen Flexibilitätspunkt hinzu. Der häufigste Fall ist ein kleines veränderliches Format und/oder eine Struktur von Frontend-Daten. Zweiter Fall - Ihre VM kann Informationen aus mehreren DTO-Objekten zusammenstellen, so dass Sie Ihren bll-Code ohne Änderungen beibehalten oder minimieren können. So ist der S.O.L.I.D. funktioniert.

Aber das nützlichste Teil ist Unit Testing. Sie können Ihre Blll viel einfacher testen, weil Ihre DTO-Objekte einfach und klar sein können. Sie sollten nicht auch von Mapping-Fehlern beängstigt sein.