In CQRS / ES wird ein Befehl vom Client an den Server gesendet und an den entsprechenden Befehlshandler weitergeleitet. Dieser Befehlshandler lädt ein Aggregat aus seinem Repository, ruft eine Methode dafür auf und speichert es zurück im Repository. Ereignisse werden generiert. Ein Ereignishandler / Saga / Prozessmanager kann diese Ereignisse abhören, um Befehle auszugeben.
Befehle (Eingabe) erzeugen also Ereignisse (Ausgabe), die dann weitere Befehle (Eingabe) in das System zurückspeisen können. Ist es nun üblich, dass ein Befehl keine Ereignisse ausgibt, sondern einen anderen Befehl in die Warteschlange stellt? Ein solcher Ansatz könnte verwendet werden, um die Ausführung in einem externen Prozess zu erzwingen.
BEARBEITEN:
Der spezifische Anwendungsfall, an den ich denke, ist die Verarbeitung von Zahlungsdetails. Der Client sendet einen PayInvoice
Befehl, dessen Nutzdaten die Kreditkartendaten des Benutzers enthalten. Der PayInvoiceHandler
übergibt einen MakeInvoicePayment
Befehl an einen separaten Prozess, der für die Interaktion mit der Payment - Gateway verantwortlich ist. Wenn die Zahlung erfolgreich ist, wird ein InvoicePaid
Ereignis generiert. Wenn das System aus irgendeinem Grund abstürzt, nachdem der PayInvoice
Befehl beibehalten wurde, aber bevor der MakeInvoicePayment
Befehl beibehalten wurde, können wir dies manuell verfolgen (es wurde keine Zahlung ausgeführt). Wenn das System abstürzt, nachdem der MakeInvoicePayment
Befehl beibehalten wurde, aber vor demInvoicePaid
Wenn das Ereignis weiterhin besteht, kann es vorkommen, dass die Kreditkarte des Benutzers belastet wird, die Rechnung jedoch nicht als bezahlt gekennzeichnet wird. In diesem Fall müsste die Situation manuell untersucht und die Rechnung manuell als bezahlt markiert werden.