Ich versuche, eine Anwendung zu entwerfen, die eine komplexe Geschäftsdomäne aufweist und eine REST-API unterstützen muss (nicht ausschließlich REST, sondern ressourcenorientiert). Ich habe einige Probleme damit, das Domänenmodell ressourcenorientiert darzustellen.
In DDD müssen Clients eines Domänenmodells die prozedurale Ebene "Application Services" durchlaufen, um auf alle Geschäftsfunktionen zuzugreifen, die von Entities und Domain Services implementiert werden. Beispielsweise gibt es einen Anwendungsdienst mit zwei Methoden zum Aktualisieren einer Benutzerentität:
userService.ChangeName(name);
userService.ChangeEmail(email);
Die API dieses Anwendungsdienstes macht Befehle (Verben, Prozeduren) verfügbar, nicht den Status.
Wenn wir jedoch auch eine RESTful-API für dieselbe Anwendung bereitstellen müssen, gibt es ein Benutzerressourcenmodell, das wie folgt aussieht:
{
name:"name",
email:"email@mail.com"
}
Die ressourcenorientierte API macht den Status und keine Befehle verfügbar . Dies wirft folgende Bedenken auf:
Jeder Aktualisierungsvorgang für eine REST-API kann einem oder mehreren Application Service-Prozeduraufrufen zugeordnet werden, je nachdem, welche Eigenschaften im Ressourcenmodell aktualisiert werden
Jeder Aktualisierungsvorgang sieht für den REST-API-Client atomar aus, ist jedoch nicht so implementiert. Jeder Aufruf von Application Service ist als separate Transaktion konzipiert. Das Aktualisieren eines Felds in einem Ressourcenmodell kann die Validierungsregeln für andere Felder ändern. Wir müssen daher alle Ressourcenmodellfelder gemeinsam validieren, um sicherzustellen, dass alle potenziellen Application Service-Aufrufe gültig sind, bevor wir mit deren Erstellung beginnen. Das gleichzeitige Überprüfen einer Reihe von Befehlen ist weitaus weniger trivial als das gleichzeitige Ausführen von Befehlen. Wie machen wir das auf einem Client, der nicht einmal weiß, dass einzelne Befehle existieren?
Das Aufrufen von Application Service-Methoden in unterschiedlicher Reihenfolge hat möglicherweise einen anderen Effekt, während die REST-API den Eindruck erweckt, dass es keinen Unterschied gibt (innerhalb einer Ressource).
Ich könnte mir ähnliche Probleme ausdenken, aber im Grunde genommen werden sie alle durch dasselbe verursacht. Nach jedem Aufruf eines Anwendungsdienstes ändert sich der Status des Systems. Regeln für die gültige Änderung, die Menge der Aktionen, die eine Entität bei der nächsten Änderung ausführen kann. Eine ressourcenorientierte API versucht, alles wie eine atomare Operation aussehen zu lassen. Aber die Komplexität, diese Lücke zu überwinden, muss irgendwohin gehen, und es scheint gewaltig.
Wenn die Benutzeroberfläche mehr befehlsorientiert ist, was häufig der Fall ist, müssen wir außerdem auf der Clientseite eine Zuordnung zwischen Befehlen und Ressourcen vornehmen und dann wieder auf der API-Seite.
Fragen:
- Sollte all diese Komplexität nur von einer (dicken) REST-zu-AppService-Zuordnungsebene bewältigt werden?
- Oder vermisse ich etwas in meinem Verständnis von DDD / REST?
- Könnte REST einfach nicht praktikabel sein, um die Funktionalität von Domänenmodellen über einen bestimmten (relativ geringen) Komplexitätsgrad hinweg verfügbar zu machen?