TL; DR:
Ein DTO beschreibt das Muster der Zustandsübertragung. Ein POCO beschreibt nichts. Es ist eine andere Art, in OOP "Objekt" zu sagen. Es stammt von POJO (Java), geprägt von Martin Fowler, der es buchstäblich nur als schickeren Namen für "Objekt" beschreibt, weil "Objekt" nicht sehr sexy ist.
Ein DTO ist ein Objektmuster, das zum Übertragen des Zustands zwischen betroffenen Schichten verwendet wird. Sie können Verhalten haben (dh technisch gesehen ein Poco sein), solange dieses Verhalten den Zustand nicht mutiert. Beispielsweise kann es eine Methode geben, die sich selbst serialisiert.
Ein POCO ist ein einfaches Objekt, aber was mit "einfach" gemeint ist, ist, dass es nichts Besonderes ist. Es bedeutet nur, dass es sich um ein CLR-Objekt ohne implizites Muster handelt. Ein Oberbegriff. Es ist nicht dafür gemacht, mit einem anderen Framework zu arbeiten. Wenn Ihr POCO beispielsweise über [JsonProperty]
alle Eigenschaften hinweg EF-Dekorationen aufweist, würde ich argumentieren, dass es sich nicht um einen POCO handelt.
Hier einige Beispiele für verschiedene Arten von Objektmustern zum Vergleichen:
- Modell anzeigen : zum Modelldaten für eine Ansicht. Verfügt normalerweise über Datenanmerkungen, um die Bindung und Validierung zu unterstützen. In MVVM fungiert es auch als Controller. Es ist mehr als ein DTO
- Wertobjekt : Wird zur Darstellung von Werten verwendet
- Gesamtwurzel : Wird zum Verwalten von Status und Invarianten verwendet
- Handler : zum Antworten auf ein Ereignis / eine Nachricht
- Attribute : werden als Dekoration verwendet, um sich mit Querschnittsthemen zu befassen
- Service : Wird zur Ausführung komplexer Aufgaben verwendet
- Controller : Wird verwendet, um den Fluss von Anforderungen und Antworten zu steuern
- Factory : Wird verwendet, um komplexe Objekte für die Verwendung zu konfigurieren und / oder zusammenzusetzen, wenn ein Konstruktor nicht gut genug ist. Wird auch verwendet, um Entscheidungen darüber zu treffen, welche Objekte zur Laufzeit erstellt werden müssen.
- Repository / DAO : Wird verwendet, um auf Daten zuzugreifen
Dies sind alles nur Objekte, aber beachten Sie, dass die meisten von ihnen im Allgemeinen an ein Muster gebunden sind. Sie könnten sie also "Objekte" nennen oder ihre Absicht genauer beschreiben und sie so nennen, wie sie ist. Dies ist auch der Grund, warum wir Designmuster haben. komplexe Konzepte in wenigen Werken zu beschreiben. DTO ist ein Muster. Die aggregierte Wurzel ist ein Muster, das Ansichtsmodell ist ein Muster (z. B. MVC & MVVM). POCO ist kein Muster.
Ein POCO beschreibt kein Muster. Es ist nur eine andere Art, auf Klassen / Objekte in OOP zu verweisen. Betrachten Sie es als ein abstraktes Konzept; Sie können sich auf alles beziehen. IMO, es gibt jedoch eine Einbahnstraßenbeziehung, denn sobald ein Objekt den Punkt erreicht, an dem es nur noch einem Zweck sauber dienen kann, ist es kein POCO mehr. Wenn Sie beispielsweise Ihre Klasse mit Dekorationen versehen, damit sie mit einem bestimmten Framework funktioniert, ist sie kein POCO mehr. Deshalb:
- Ein DTO ist ein POCO
- Ein POCO ist kein DTO
- Ein Ansichtsmodell ist ein POCO
- Ein POCO ist kein Ansichtsmodell
Bei der Unterscheidung zwischen den beiden geht es darum, die Muster klar und konsistent zu halten, um Bedenken nicht zu überschreiten und zu einer engen Kopplung zu führen. Zum Beispiel, wenn Sie ein Geschäftsobjekt haben, das Methoden zum Mutieren des Status enthält, aber auch mit EF-Dekorationen zum Speichern in SQL Server UND JsonProperty zur Hölle dekoriert ist, damit es über einen API-Endpunkt zurückgesendet werden kann. Dieses Objekt würde Änderungen nicht tolerieren und wahrscheinlich mit Varianten von Eigenschaften übersät sein (z. B. UserId, UserPk, UserKey, UserGuid, wobei einige von ihnen als nicht in der Datenbank gespeichert und andere als nicht serialisiert markiert sind JSON am API-Endpunkt).
Wenn Sie mir also sagen würden, dass etwas ein DTO ist, würde ich wahrscheinlich sicherstellen, dass es nie für etwas anderes als das Bewegen des Zustands verwendet wird. Wenn Sie mir sagen würden, dass etwas ein Ansichtsmodell ist, würde ich wahrscheinlich sicherstellen, dass es nicht in einer Datenbank gespeichert wird. Wenn Sie mir sagen würden, dass etwas ein Domain-Modell ist, würde ich wahrscheinlich sicherstellen, dass es keine Abhängigkeiten von irgendetwas außerhalb der Domain hat. Aber wenn Sie mir sagen würden, dass etwas ein POCO ist, würden Sie mir nicht wirklich viel erzählen.