Domänenmodelle über API verfügbar machen


8

Ich erstelle eine einfache RESTful-API für eine webbasierte Anwendung, an der ich arbeite, und frage mich, wie ich meine Domain-Modelle am besten verfügbar machen kann.

Angenommen, ich habe eine Benutzerklasse und möchte eine JSON-Antwort mit den verschiedenen Benutzereigenschaften bereitstellen. Ich möchte natürlich nicht alle Eigenschaften meines Modells (z. B. DateCreated, PasswordHash usw.) aus Sicherheits- und Bandbreitenproblemen öffentlich zugänglich machen.

Ich habe in Datenübertragungsobjekte gelesen und frage mich, ob dies der richtige Weg ist. Wenn ich recht habe, könnte ich beispielsweise ein Benutzermodell an mein Benutzer-DTO übergeben und sicherstellen, dass dieses DTO nur die von mir ausgewählten Benutzereigenschaften verfügbar macht (was auch dazu beitragen würde, meine Modelle von meiner öffentlichen API zu entkoppeln).

Ist diese Lösung angemessen oder gibt es bessere Möglichkeiten, dies zu tun?

Vielen Dank.


1
"Ich erstelle eine einfache öffentliche API" und "Ich möchte offensichtlich nicht jede Eigenschaft öffentlich zugänglich machen" ergeben für mich keinen Sinn. Könnten Sie bitte klarstellen, was Sie meinen?
Uooo

Ich habe meine Frage bearbeitet, um mehr Klarheit zu schaffen, aber im Wesentlichen meine ich, dass mein Benutzerobjekt einige Eigenschaften wie Kennwort und DateCreated aufweist, die nicht in der JSON-Darstellung des Benutzers angezeigt werden sollten, sondern die meisten anderen Benutzerdaten sollte verfügbar sein. Ich frage mich, ob DTOs mir helfen können, die verfügbaren Eigenschaften von den nicht verfügbaren zu trennen.
James

Antworten:


6

Das ist genau einer der Gründe, warum DTOs existieren.

Der Nachteil hierbei ist, dass das Hinzufügen von DTOs Ihre Implementierung etwas komplexer und damit fehleranfällig macht - beispielsweise eine Nichtübereinstimmung beim Zuordnen des Domänenobjekts zu einem DTO. Verwenden Sie dazu Unit-Tests!

Eine andere Sache, die Sie mit Ihrem DTO tun könnten und die in RESTful-Diensten häufig übersehen wird, ist die Behandlung von Hypertextdaten für Referenzen, verschachtelte Objekte und mögliche Operationen.

Siehe Martin Fowlers PoEAA: "[...] Es ist erwähnenswert, dass ein weiterer Vorteil darin besteht, den Serialisierungsmechanismus für die Datenübertragung über das Kabel zu kapseln. Durch die Kapselung der Serialisierung auf diese Weise halten die DTOs diese Logik aus dem Rest des Codes heraus und bieten Sie auch einen klaren Punkt, um die Serialisierung zu ändern, falls Sie dies wünschen. "

http://martinfowler.com/eaaCatalog/dataTransferObject.html

TL; DR: Ich mag die Idee, die Belange der Domänenlogik und der "RESTful-Verkabelung" durch DTOS zu trennen, obwohl ein komplexeres Design eingeführt wird.


1
Das habe ich mir gedacht, wollte das aber nur klären! Zumindest für meine Situation denke ich, dass die Vorteile die Nachteile überwiegen. Danke für deine Antwort!
James

Unter der Annahme, dass Ihr Back-End-Code stark typisiert ist, wird die entstehende Komplexität durch die Überprüfung des Typs der Kompilierungszeit abgewogen. Zuordnungen von dto.setProp (entity.getProp) können nicht kompiliert werden.
Jason

3

Obwohl dies nicht die Hauptabsicht von Datenübertragungsobjekten ist , können DTOs verwendet werden, um dieses Problem auf ähnliche Weise wie im Datenteil eines Präsentationsmodells zu lösen .

Wie bereits erwähnt, kann dies Ihr Design aufblähen und etwas so Einfaches wie ein hinzugefügtes Feld erfordert möglicherweise Änderungen, um durch die zusätzlichen Ebenen zu sprudeln. Aus diesem Grund ist es ratsam zu prüfen, ob Sie Metadaten zur Beschreibung der Serialisierung des Objekts bereitstellen können . In vielen Sprachen erfolgt dies in Form von speziellen Anmerkungen, die auf Ihre Domänenobjekte angewendet werden können, um die mühsame Übersetzung in DTOs zu vermeiden. Pakete wie Jackson ( durch die Verwendung von Mixins ) nehmen diese Idee oft etwas weiter, um Ihre Metadaten vollständig von Ihrem Domain-Modell zu trennen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.