2015-09-10 11 views
5

Ich arbeite an einer Back-End-Anwendung, die eine REST-API freigibt, und ich (versuche) Domain Driven Design in meinem Projekt zu verwenden.Sollten API-Infrastrukturklassen Teil der Domäne in DDD sein?

Die REST-API arbeitet mit einer festen Gruppe von Domänenklassen. Für jede Agregate-Wurzel aus der Domäne gibt es einen separaten REST-Endpunkt. Doch trotz aller Bemühungen gibt es Fälle, wenn neue Klassen, nicht von den Domain-Klassen (Infrastruktur Klassen) Ableiten entstehen, zB:

  • ein Klasse Haltezustände von Batch-Operationen [{"id": 1, "status": "success"},{"id": 2, "status": "failure", "message": "detailed message"}]
  • eine Klasse mit den Säulen vom Benutzer gewählten [{"column": "id", "order": 1}, {"column":"created", "order": 2 }]

nun zwei Möglichkeiten:

  • ist es in Ordnung, die REST-API aussetzen Klassen zu haben, die nicht Teil sind die Domain?
  • oder sollten diese Klassen Teil der Domäne werden?
+1

Ich denke, es ist völlig in Ordnung, Verträge, die Schicht-spezifisch sind, zu veröffentlichen. Zum Beispiel werden DTOs normalerweise in der Anwendungsschicht definiert ... – plalx

Antwort

5

Sie sollten nicht versuchen, die REST-API direkt für Ihr Domänenmodell zu erstellen. Es gibt eine ganze Reihe von Verantwortlichkeiten, die Sie für eine solche Schnittstelle benötigen, die Ihr Domänenmodell durcheinander bringen würde. Z.B. Transaktionssteuerung, Sicherheit, Eingabevalidierung sind Dinge, die Sie wahrscheinlich brauchen, die aber nicht in das Domänenmodell gehören.

Dafür gibt es Anwendungsdienste.

Erstellen Sie eine dünne Schicht um Ihren Domain-Modell, das die Anwendungsdienste enthält (oft Service Layer genannt). Die App-Dienste sind die direkten Clients des Domänenmodells. Sie sind in der Regel um Use Cases anstelle von Aggregaten organisiert. Jetzt ist Ihre REST-API der direkte Client der App-Services und nicht das Domänenmodell.

Die zwei Klassen, die Sie erwähnen, würden dann auch gut in die Serviceebene passen.

Edit:

Beachten Sie, dass, wenn Hexagonal Architektur mit (das ist eine gute Passform für DDD ist), die Service-Schicht nicht das gleiche wie die Persistenz-Schicht ist. Die Serviceschicht verwendet die Persistenzschicht, um Aggregate in der Datenbank zu laden und zu speichern.

+0

Ist die Infrastruktur der Anwendungsebene agnostisch? Also ist das REST-Framework der erste Client der Anwendungsschicht? – danfromisrael

+0

@danfromisrael sehe meine aktualisierte Antwort – theDmi

+0

Danke @theDmi für die Antwort. Ich stimme dem Ansatz, den Sie beschrieben haben, voll zu, aber ich habe eine Frage. Nehmen wir an, wir haben eine GET-Methode, die eine Liste von Objekten zurückgibt, jedes Objekt hat eine Statusspalte. Jetzt müssen wir eine neue GET-Methode erstellen, die eine Liste eindeutiger Status zusammen mit der Anzahl der Elemente mit diesem Status zurückgibt. Zu diesem Zweck erstellen wir eine neue DTO-Klasse mit zwei Attributen: 'String status' und' Long count'. In welcher Schicht sollte diese Klasse definiert werden? Bewerbung, oder? Sollte das Repository, das auf DDD basiert, Instanzen der Klassen der Anwendungsschicht zurückgeben? –

Verwandte Themen