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 PayInvoiceBefehl, dessen Nutzdaten die Kreditkartendaten des Benutzers enthalten. Der PayInvoiceHandlerübergibt einen MakeInvoicePaymentBefehl an einen separaten Prozess, der für die Interaktion mit der Payment - Gateway verantwortlich ist. Wenn die Zahlung erfolgreich ist, wird ein InvoicePaidEreignis generiert. Wenn das System aus irgendeinem Grund abstürzt, nachdem der PayInvoiceBefehl beibehalten wurde, aber bevor der MakeInvoicePaymentBefehl beibehalten wurde, können wir dies manuell verfolgen (es wurde keine Zahlung ausgeführt). Wenn das System abstürzt, nachdem der MakeInvoicePaymentBefehl beibehalten wurde, aber vor demInvoicePaidWenn 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.