Frage

POCO = Plain Old CLR (oder besser: Class) Object

DTO = Data Transfer Object

In dieser Post gibt es einen Unterschied, aber ehrlich gesagt meisten Blogs ich POCO lesen in der Art und Weise beschreiben DTO definiert. DTOs sind einfache Datencontainer verwendet, um Daten zwischen den Schichten einer Anwendung zum bewegen

Sind POCO und DTO das Gleiche?

War es hilfreich?

Lösung

A POCO folgt den Regeln der OOP. Es sollte (aber muss nicht) Zustand haben und Verhalten. POCO stammt aus POJO, geprägt von Martin Fowler [ Anekdote hier ]. Er verwendete den Begriff POJO als eine Möglichkeit, es sexy zu machen, um den Rahmen schweren EJB-Implementierungen abzulehnen. POCO sollte in diesem Zusammenhang in .net verwendet werden. Lassen Sie sich nicht Frameworks Ihr Objekt Design diktieren.

Ein DTO einziger Zweck es ist Staat zu übertragen, und sollte kein Verhalten. Siehe Martin Fowler Erklärung eines DTO für ein Beispiel für die Verwendung dieses Musters.

Hier ist der Unterschied: POCO einen Ansatz zur Programmierung beschreibt (gute altmodische objektorientierte Programmierung), wobei DTO ist ein Muster , das verwendet wird, um „Transferdaten“ mit Objekte.

Während Sie POCOs wie DTOs behandeln können, laufen Sie Gefahr der Schaffung eines anämischen Domänenmodell , wenn Sie dies tun. Darüber hinaus gibt es eine Diskrepanz in der Struktur, sollte da DTOs entworfen werden, um Daten zu übertragen, nicht die wahre Struktur des Business-Bereichs zu repräsentieren. Das Ergebnis davon ist, dass DTOs mehr flach sein neigen als Ihre tatsächliche Domain.

In einer Domäne von jeder angemessenen Komplexität, sind Sie fast immer besser separate Domäne POCOs zu schaffen und sie zu DTOs übersetzen. DDD (Domain Driven Design) definiert die Anti-Korruptions-Schicht (ein weiterer Link hier , aber am besten, was zu tun ist kaufen das Buch ), was eine gute Struktur, die die Trennung klar.

macht

Andere Tipps

Es ist wahrscheinlich überflüssig für mich zu tragen, da ich meine Position schon in meinem Blog-Artikel erwähnt, aber der letzte Absatz dieses Artikels Art von Summen Dinge:

So, zum Schluss, lernen die POCO zu lieben, und stellen Sie sicher, Sie verbreiten keine Fehlinformationen über es die gleiche Sache wie ein DTO zu sein. DTOs sind einfache Datencontainer zum Bewegen von Daten zwischen den Schichten einer Anwendung verwendet wird. POCOs sind vollwertiges Business-Objekte mit dem eine Anforderung, dass sie Persistence Ignorant (kein get oder Methoden speichern) sind. wenn Sie nicht überprüft haben schließlich aus Jimmy Nilsson Buch noch, holen Sie es von Ihrem örtlichen Universität Stapel auf. Es hat Beispiele in C # und es ist ein großer lesen.

BTW, Patrick ich die POCO als Lifestyle Artikel zu lesen, und ich stimme völlig zu, dass ist ein fantastischer Artikel. Es ist eigentlich ein Abschnitt aus dem Jimmy Nilsson Buch, das ich empfehlen. Ich hatte keine Ahnung, dass es online war. Sein Buch ist wirklich die beste Quelle für Informationen, die ich auf POCO / DTO / Repository / und andere DDD Entwicklungspraktiken gefunden haben.

POCO ist einfach ein Objekt, das nicht eine Abhängigkeit von einem externen Rahmen übernimmt. Es ist klar.

Ob ein POCO Verhalten hat oder es ist nicht unerheblich.

Ein DTO kann POCO sein, wie kann ein Domain-Objekt (die in der Regel reich an Verhalten wären).

DTOs Typischerweise sind eher Abhängigkeiten von externen Rahmen nehmen (z. Attribut) für die Serialisierung Zwecke wie sie typischerweise Ausgang an der Grenze eines Systems.

In typischem Zwiebel Stil Architekturen (oft innerhalb eines breit DDD-Ansatzes verwendet) die Domänenschicht in der Mitte angeordnet ist, und so sollten ihre Objekte an dieser Stelle nicht, müssen Abhängigkeiten außerhalb dieser Schicht.

ich einen Artikel zu diesem Thema geschrieben: DTO vs Value Object vs POCO .

Kurz gesagt:

  • DTO! = Value Object
  • DTO ⊂ POCO
  • Wert Objekt ⊂ POCO

Ich denke, ein DTO kann ein POCO sein. DTO ist mehr über die Nutzung des Objekts, während POCO mehr von der Art des Objekts (von Architekturkonzepten entkoppelt).

Ein Beispiel, bei dem ein POCO etwas anderes als DTO ist, wenn man über POCO redet in Ihrem Domain-Modell / Business-Logik-Modell, das eine nette OO Darstellung Ihrer Problemdomäne ist. Sie konnten die POCO während der gesamten Anwendung verwenden, aber dies einige unerwünschte Nebenwirkung, eine solche Kenntnis Lecks haben könnte. DTO sind beispielsweise aus der Service-Schicht verwendet, die die Benutzeroberfläche mit in Verbindung steht, die die DTO flache Darstellung der Daten sind, und sind nur für die Bereitstellung der UI mit Daten verwendet werden, und Änderungen in der Dienstschicht in Verbindung steht. Die Dienstschicht ist verantwortlich für die in beiden Richtungen auf die POCO-Domäne Objekte der DTO abbildet.

Aktualisieren Martin Fowler sagte , dass dieser Ansatz ist eine schwere Straße zu nehmen, und nur genommen werden, wenn es eine erhebliche Diskrepanz zwischen der Domänenschicht und der Benutzeroberfläche ist.

Ein Hauptanwendungsfall für eine DTO ist, Daten von einem Webdienst in zurückzukehren. In diesem Fall POCO und DTO sind gleichwertig. Jedes Verhalten in der POCO würde entfernt werden, wenn es von einem Webdienst zurückgegeben wird, so dass es nicht wirklich wichtig, ob es das Verhalten hat.

Hier ist die allgemeine Regel: DTO == böser und Indikatoren für over-engineered Software. POCO == gut. ‚Unternehmen‘ Muster haben die Gehirne von einer Menge Leute in der Java EE Welt zerstört. Bitte wiederholen Sie nicht den Fehler in .NET Land.

DTO Klassen werden verwendet, um Serialisierung / Deserialisierung von Daten aus verschiedenen Quellen. Wenn Sie ein Objekt von einer Quelle deserialisieren wollen, egal, was externe Quelle ist: Service, Datei, Datenbank usw. können Sie nur einen Teil davon verwenden mögen, aber Sie wollen eine einfache Möglichkeit, diese Daten zu einem deserialisieren Objekt. nach, dass Sie kopieren die Daten an die XModel Sie verwenden möchten. Ein Serializer ist eine schöne Technologie DTO Objekte zu laden. Warum? Sie benötigen nur eine Funktion (deserialize), um das Objekt zu laden.

TL; DR:

Ein DTO beschreibt das Muster der Zustandsübertragung. Ein POCO nichts beschreiben. Es ist eine andere Art und Weise „Objekt“ in OOP zu sagen. Es stammt aus POJO (Java), geprägt von Martin Fowler, der buchstäblich nur um es als schickem Namen beschreibt für ‚Objekt‘, weil ‚Objekt‘ nicht sehr sexy ist.

A DTO ist ein Objektmuster zu übertragen Zustand zwischen Schichten betreffen verwendet. Sie können das Verhalten haben (das heißt technisch ein poco sein kann), solange das Verhalten nicht den Staat nicht mutieren. Zum Beispiel kann es eine Methode, die sich serialisiert.

A POCO ist eine einfache Aufgabe, aber was unter ‚Ebene‘ gemeint ist, ist, dass es nicht besonders. Es bedeutet nur, es ist ein CLR-Objekt ohne zwingende Muster zu. Ein allgemeiner Begriff. Es ist nicht mit einem anderen Rahmen aus zu arbeiten. Also, wenn Ihr POCO hat [JsonProperty] oder EF Dekorationen im ganzen ist es Eigenschaften, zum Beispiel, dann würde ich argumentieren, dass es nicht ein POCO ist.

Hier einige Beispiele für verschiedene Arten von Objektmustern vergleichen:

  • Modell : verwendet, um Daten für eine Ansicht zu modellieren. Normalerweise hat Daten Anmerkungen verbindlich und Validierung zu unterstützen. In MVVM, es fungiert auch als Controller. Es ist mehr als ein DTO
  • Value Object : verwendet, um Werte zu repräsentieren
  • Aggregate Wurzel : verwendet Zustand und Invarianten verwalten
  • Handlers : verwendet, um ein Ereignis / Nachricht antworten
  • Attribute : als Dekorationen mit Querschnittsthemen befassen
  • Service : verwendet, um komplexe Aufgaben auszuführen
  • Controller : verwendet Fluss-Anforderungen zu steuern und Antworten
  • Fabrik : zur Konfiguration und / oder komplexe Objekte für den Einsatz montieren, wenn ein Konstruktor nicht gut genug ist. Auch verwendet, Entscheidungen zu treffen, auf denen Objekte müssen zur Laufzeit erstellt werden.
  • Repository / DAO : verwendet, um Zugriff auf Daten

Das ist alles nur Objekte, bemerkt aber, dass die meisten von ihnen im Allgemeinen zu einem Muster gebunden sind. So könnte man sie „Objekte“ nennen, oder Sie können genauer sein über seine Absicht und nennen es, was es ist. Dies ist auch, warum wir Entwurfsmuster haben; komplexe Konzepte in einigen Werken zu beschreiben. DTO ist ein Muster. Aggregat Wurzel ist ein Muster, Ansicht Modell ist ein Muster (z MVC & MVVM). POCO ist kein Muster.

A POCO beschreibt nicht ein Muster. Es ist nur eine andere Art des Verweises auf Klassen / Objekte in OOP. Betrachten Sie es als ein abstraktes Konzept; sie können auf etwas beziehen werden. IMO, gibt es eine Einbahn Beziehung aber, weil, sobald ein Objekt den Punkt erreicht, wo es nur sauber einen Zweck dienen kann, ist es nicht mehr ein POCO ist. Zum Beispiel, wenn Sie Ihre Klasse mit Dekorationen markieren, um sie mit einem gewissen Rahmen funktionieren, ist es nicht mehr ein POCO. Deshalb:

  • A DTO ist ein POCO
  • A POCO ist kein DTO
  • A View-Modell ist ein POCO
  • A POCO ist keine Ansicht Modell

Der Punkt einen Unterschied zwischen den beiden bei der Herstellung ist über Muster klar und konsequent in Mühe zu halten, um nicht Sorgen zu überqueren und zu enge Kopplung führen. Wenn Sie zum Beispiel haben ein Business-Objekt, das Methode zu mutieren Zustand hat, ist aber auch mit EF Dekorationen zur Hölle dekorierte für das Speichern zu SQL Server und JsonProperty, so dass es wieder über einen API-Endpunkt gesendet werden kann. Diese Aufgabe würde intolerant sein, zu ändern und wahrscheinlich mit Varianten von Eigenschaften (zB UserId, UserPk, UserKey, UserGuid, wo einige von ihnen markiert sind bis übersät sein würde nicht auf die DB und anderen gerettet werden markiert bis zu nicht serialisiert werden JSON auf dem API-Endpunkt).

Also, wenn Sie sind mir etwas zu sagen war ein DTO, dann würde ich wahrscheinlich sicherstellen, dass es nie für etwas anderes als um Zustand verwendet bewegt. Wenn Sie mir gesagt, war etwas, das ein View-Modell, dann würde ich wahrscheinlich sicherstellen, dass es nicht in einer Datenbank gespeichert zu werden. Wenn Sie mir gesagt, war etwas, das ein Domain Model, dann würde ich wahrscheinlich sicherstellen, dass es had keine Abhängigkeiten von irgendetwas außerhalb der Domäne. Aber wenn Sie mir gesagt, war etwas ein POCO, würden Sie nicht wirklich mir zu sagen, werden viel.

Sie sie nicht einmal nennen DTOs. Sie heißen Modelle .... Zeitraum. Modelle haben nie Verhalten. Ich weiß nicht, wer mit diesem dummen Begriff DTO kam, aber es muss eine .NET Sache ist alles, was ich herausfinden kann. Denken Sie an Ansicht Modelle in MVC, gleiche Damm ** Sache werden Modelle verwendet Zustand zwischen den Schichten Server-Seite zu übertragen oder über den Draht Periode, sie sind alle Modelle. Eigenschaften mit Daten. Dies sind Modelle, die Sie ove den Draht passieren. Models, Models Models. Das ist es.

Ich wünsche der dumme Begriff DTO weggehen würde aus unserem Wortschatz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top