2017-08-09 2 views
0

Sollte ein Befehls-Handler auch auf referentielle Integrität prüfen? Diese FAQ schlagen vor, dass Sie dies nicht in den Aggregaten() überprüfen sollten. Prüft nicht, ob etwas Teil der Validierung existiert?CQRS/DDD: Überprüfen der referenziellen Integrität

Zum Beispiel können Sie eine Anwendung haben, wo Sie Kommentare zu einem Artikel hinzufügen können.

Der Befehl würde diese Felder haben:

  • Id
  • articleId
  • UserId
  • Text

Für dieses Beispiel der Kommentar und Artikel sind eine andere aggregateroot.

Sollten Sie nach diesem Beispiel suchen, wenn der Artikel bereits existiert und der Benutzer existiert? Es ist ein bisschen seltsam, dass Sie einen Kommentar zu einem Artikel hinzufügen können, der nicht existiert.

Antwort

2

Ich vermute, dass Sie einen Grund haben, Artikel und Kommentar in separate Aggregatwurzeln zu teilen. Wenn ich mit einer Frage wie Ihrer konfrontiert werde, ist dies normalerweise ein Hinweis auf die Möglichkeit, das Domänenmodell zu überdenken.

Es ist nichts falsch mit der referenziellen Integritätsprüfung, aber denken Sie über die eventuelle Natur der Änderungen an den Aggregaten, die nicht zur selben Wurzel gehören. Was bedeutet das Ergebnis der Validierung?

Wenn der Artikel nicht existiert, ist es, weil es nicht hinzugefügt wurde und Sie ein Integritätsproblem in dem Befehl haben? Oder wurde es zwar hinzugefügt, aber noch nicht auf die Abfrageseite der Anwendung übertragen? Oder vielleicht wurde es bereits entfernt, bevor der Benutzer den Kommentar gepostet hat?

Was ist, wenn die Validierung bestätigt, dass der Artikel existiert? Vielleicht hat Moderator es entfernt, aber das Ergebnis wurde noch nicht verbreitet?

Erinnern Sie sich, Sie konnten sich nur auf die Reihenfolge der Ereignisse verlassen, wenn sie unter demselben aggregierten Stamm stattfinden.

Zusammenfassend: Sie konnten referenzielle Integrität in einem Befehlshandler überprüfen, solange Sie erkennen, dass es möglicherweise falsche positive und falsche negative gibt. Wenn Sie erwarten, dass eingehende Befehle oft unzuverlässige Daten enthalten, könnte diese Überprüfung die Fehlerrate begrenzen.Versuchen Sie jedoch, die Struktur Ihrer Aggregate zu überdenken, wenn die Konsistenz kritisch ist.

1

Sollten Sie nach diesem Beispiel suchen, wenn der Artikel bereits existiert und der Benutzer existiert?

Nein normalerweise, nein.

Es fühlt sich ein bisschen seltsam an, dass Sie einen Kommentar zu einem Artikel hinzufügen können, der nicht existiert.

Trennung von Verantwortlichkeiten: Das Domänenmodell ist verantwortlich für das Verständnis, wie der Befehl an denaktuellen Zustand des Modells gilt. Der Befehls-Handler prüft nur die Integrität des Befehls.

+3

Einverstanden. Ich würde nur hinzufügen, dass, obwohl die Domain nicht dafür verantwortlich ist, zu bestimmen, ob * sie * aufgerufen werden kann, es sicherlich etwas außerhalb der Domain geben sollte, das wahrscheinlich * tut *. Zum Beispiel sollte etwas die Berechtigung prüfen (sollte der Befehl erlaubt sein). Auf die gleiche Weise sollte etwas prüfen, ob es tatsächlich in Ordnung ist, den Befehl auszuführen, da es sicherlich * seltsam * ist, einen Kommentar zu einem Artikel hinzuzufügen, der nicht existiert, und das beispielsweise durch einen Benutzer, der nicht existiert. Dies gilt beispielsweise für das Hinzufügen eines Auftrags für einen Kunden, der nicht existiert. –

Verwandte Themen