51 Stimmen

Sollte die Repository-Schicht Datentransfer-Objekte (DTO) zurückgeben?

Ich habe eine Repository-Schicht, die für meinen Datenzugriff verantwortlich ist und von einer Dienstschicht aufgerufen wird. Die Dienstschicht gibt DTOs zurück, die serialisiert und über die Leitung gesendet werden. Meistens tun Dienste nicht viel mehr, als auf ein Repository zuzugreifen und das zurückzugeben, was das Repository zurückgibt.

Damit das funktioniert, muss das Repository jedoch eine Instanz dieses DTOs zurückgeben. Andernfalls müssten Sie zunächst das vom Repository zurückgegebene Datenschichtobjekt einem DTO in der Dienstebene zuordnen und dieses zurückgeben. Das erscheint einfach nur verschwenderisch.

Wenn die Erstellung der DTOs in der Serviceschicht erfolgt, muss etwas, das zuvor mit einem Repository-Aufruf und somit einer Datenbankabfrage erledigt werden konnte, nun mit mehreren Repository-Aufrufen in der Serviceschicht geschehen, um das endgültige DTO "zusammenzustellen". Es sei denn, ich erstelle ein Transportobjekt zwischen der Daten- und der Serviceschicht, das ein solches zusammengesetztes Objekt enthalten kann. Welche dann muss auf ein DTO abgebildet werden. Es scheint einfach verschwenderisch zu sein, um der Reinheit willen. Aber es scheint auch falsch zu sein, dass die Repository-Schicht Objekte zurückgibt, die nur existieren, um über die Leitung gesendet zu werden.

44voto

Aliostad Punkte 78595

Kurze Antwort: Nein.

Lange Antwort: Das Repository ist dafür zuständig, persistierte Daten in Entitäten (Modelle) zurückzuverwandeln und umgekehrt.

Modell ist ein Geschäftsmodell, das eine Geschäftseinheit darstellt. DTO hingegen - obwohl es wie ein Modell aussieht - befasst sich mit der Übertragung des Objekts zwischen verschiedenen Umgebungen und ist im Wesentlichen ein transientes Objekt. Normalerweise Kartenzeichner sind für die Umwandlung des Modells in eine DTO verantwortlich.

5voto

jalopy67 Punkte 39

Ihr Repository muss also die gesamte Entität hydratisieren, auch wenn sie nicht verwendet wird? Das scheint sehr ineffizient zu sein. - ajbeaven 29. Okt '18 um 23:25

Könnten Sie der Repository-Schnittstelle nicht Methoden für Aufrufe hinzufügen, die nicht die gesamte Entität hydrieren müssen? Ich vermute, das könnte zu aufgeblähten Schnittstellen führen, was meiner Meinung nach eines der Hauptargumente dagegen ist.

Um die Frage zu beantworten, stimme ich der akzeptierten Antwort Nein zu. Repository-Implementierungen befinden sich in der Persistenzschicht. Die Domänenschicht muss möglicherweise tiefe oder flache Objekte von der Persistenzschicht abrufen, die nichts weiß, außer der Schnittstelle, die sie implementieren muss. Wenn die Domäne ständig nach einem vollen Kühlschrank fragt, obwohl sie nur Butter braucht, dann muss vielleicht die Schnittstelle (oder vielleicht das Datenmodell) überarbeitet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X