Ich frage mich, denn wenn ja, warum bietet Entity Framework keine Logik zum Erstellen eines neuen Objekts mit denselben Eigenschaften zum Übertragen von Daten zwischen Ebenen an?
Ich verwende die Entitätsobjekte, die ich mit dem Entitätsframework generiere.
Antworten:
Es liegt an dir.
Die meisten Leute werden Ihnen sagen, dass es keine gute Praxis ist, aber Sie können in einigen Fällen damit durchkommen.
EF hat aus mehreren Gründen nie gut mit DDD gespielt, aber zwei stechen heraus: Sie können keine parametrisierten Konstruktoren für Ihre Entitäten haben und Sie können keine Sammlungen einkapseln. DDD stützt sich darauf, da das Domänenmodell sowohl Daten als auch Verhalten enthalten sollte.
In gewisser Weise zwingt EF Sie zu einem anämischen Domänenmodell, und in diesem Fall können Sie die Entitäten als DTOs verwenden. Einige Probleme können auftreten, wenn Sie Navigationseigenschaften verwenden, aber Sie können diese Entitäten serialisieren und über das Netzwerk senden. Es kann jedoch nicht praktisch sein. Sie müssen die Serialisierung für jede Entität steuern, die Eigenschaften hat, die Sie nicht senden müssen. Der einfachere Weg besteht darin, separate Klassen zu entwerfen, die auf die Datenübertragung zugeschnitten sind. Zu diesem Zweck werden Bibliotheken wie AutoMapper erstellt.
Beispiel: Angenommen, Sie haben eine Klasse
Person
mit der folgenden Definition aufgerufen :Angenommen, Sie möchten irgendwo eine Liste der Mitarbeiter anzeigen, ist es möglicherweise sinnvoll, nur die Zeichen
Id
,FirstName
und zu sendenLastName
. Aber Sie müssen alle anderen irrelevanten Eigenschaften übermitteln. Es ist kein so großes Problem, wenn Sie sich nicht für die Größe der Antwort interessieren, aber die allgemeine Idee ist, nur die relevanten Daten zu senden. Auf der anderen Seite können Sie eine API entwerfen, die eine Liste von Personen zurückgibt. In diesem Fall ist möglicherweise das Senden aller Eigenschaften erforderlich. Daher ist es sinnvoll, die Entitäten zu serialisieren und zu senden. In diesem Fall ist das Erstellen einer DTO-Klasse umstritten. Manche Leute mögen es, Entities und DTOs zu verwechseln, andere nicht.Um Ihre aktualisierte Frage zu beantworten, ist EF ein ORM. Seine Aufgabe besteht darin, Datenbankdatensätze Objekten zuzuordnen und umgekehrt. Was Sie mit diesen Objekten vor und nach dem Durchlaufen von EF tun, gehört nicht zu ihren Anliegen. Das sollte es auch nicht sein.
quelle
As of EF Core 2.1, only services known by EF Core can be injected. Support for injecting application services is being considered for a future release.
Ich lasse sehr gerne Anwendungsdienste in meine Entitäten einfließen .Nein ist es nicht.
Im Idealfall stimmen DTOs mit Ihren Persistenz-Repositorys (auch bekannt als Ihre Datenbanktabellen) überein.
Aber Ihre Businessklassen sind nicht unbedingt eine Übereinstimmung. Möglicherweise benötigen Sie zusätzliche Klassen oder getrennte oder verknüpfte Klassen für Ihre Datenbank. Wenn Ihre Anwendung klein ist, sehen Sie diese Art von Problemen möglicherweise nicht wirklich. Bei mittleren bis großen Anwendungen tritt dies jedoch häufig auf.
Eine andere Sache ist, dass DTOs Teil der Domäne dessen sind, was mit Persistenz zu tun hat, während Ihre Business-Schicht nichts über sie wissen sollte.
quelle
Das ist eigentlich eine sehr schlechte Idee. Martin Fowler hat einen Artikel über lokale DTOs .
Kurz gesagt,
DTO
Pattern wurde zum Übertragen von Daten außerhalb des Prozesses verwendet, z. B. über den Draht und nicht zwischen Schichten innerhalb desselben Prozesses.quelle
Nein, es ist eine schlechte Praxis.
Einige Gründe:
@JsonIgnore
in der Java-Welt) ignorieren , aber dies führt zum nächsten Problem ...get
Methode der Entität aufzurufen .So ist es einfacher und sicherer, eine Art Mapper-Tool zu verwenden, das Ihnen bei diesem Job hilft und die Entitätsfelder einem Dto zuordnet.
quelle
Um das zu vervollständigen, was @Dherik gesagt hat, sind die Hauptprobleme bei der Verwendung von Entitätsobjekten als Datenübertragungsobjekte:
In einer Transaktion gehen Sie das Risiko ein, Änderungen an Ihrer Entität festzuschreiben, da Sie diese als DTO verwenden (selbst wenn Sie die Entität der Sitzung in einer Transaktion trennen können, müssen Sie diesen Status meistens vorher überprüfen Änderungen an Ihrem Entity-DTO und stellen Sie sicher, dass Sie sich nicht in einer Transaktion befinden oder dass die Sitzung geschlossen wurde, wenn Sie nicht möchten, dass die Änderungen beibehalten werden).
Die Größe der Daten, die Sie zwischen dem Client und dem Server gemeinsam nutzen: Manchmal möchten Sie nicht den gesamten Inhalt einer Entität an den Client senden, um die Größe der Antwort der Anforderung zu minimieren. Die Trennung des DTO von der Entität ist flexibler, um die Daten, die Sie in bestimmten Anwendungsfällen senden möchten, zu spezialisieren.
Sichtbarkeit und Wartung: Sie müssen Ihre jpa / hibernate-Annotationen in den Feldern Ihrer Entität verwalten und die jackson-Annotationen für die Serialisierung in json an derselben Stelle verwalten (auch wenn Sie sie von der Entitätsimplementierung trennen können, indem Sie sie in die von der geerbte Schnittstelle einfügen Entität). Wenn Sie dann Ihren DTO-Inhalt ändern, indem Sie ein neues Feld hinzufügen, kann eine andere Person wahrscheinlich annehmen, dass es sich um ein Feld der Entität handelt, also um ein Feld der betreffenden Tabelle in Ihrer Datenbank (auch wenn Sie die
@Transient
Annotation für alle Ihre DTO-Felder verwenden können Im Falle ..!).Meiner Meinung nach macht es beim Lesen der Entität Geräusche, aber meine Meinung ist sicherlich subjektiv.
quelle