Ich bin ein wenig verwirrt über den Fluss in einem System, das Domänenereignisse verwendet, um das Lesemodell zu erstellen. Insbesondere, wie gehen wir mit der Tatsache um, dass der Benutzer erwartet, dass sich Daten (und seine Ansicht) ändern, wenn sie einen Befehl ausführen, aber aufgrund unserer Systemarchitektur (nicht blockierende Aufrufe zum Veröffentlichen von Ereignissen) ändert sich die tatsächliche Datenbank möglicherweise nicht vor dem Seite wird neu geladen?Anzeigen von Änderungen in der Ansicht bei Verwendung von CQRS & DDD mit Domänenereignissen & ServiceBus
Ich hoffe, das Design eines unserer Systeme mehr inline mit CQRS über Ereignisse und einen Service-Bus zu bewegen.
Sagen wir, mein Flow als solche geht:
Schaltfläche Benutzer in View klickt Aufgabe der Entfernung von Zahlungsmethode von ihrem Konto auszuführen.
Controller ruft PaymentMethodRemovalService auf und übergibt es accountId & paymentMethodId.
Controller verwendet AccountRepository Konto abrufen und ruft account.RemovePaymentMethod (id)
Konto, dass der Betrieb Ereignis PaymentMethodRemovedMessage (accountId, paymentMethodId)
Weil Event-Publishing ist asynchron erfolgen kann und veröffentlicht validiert, Wir müssen jetzt von der Service- und Rückkehransicht vom Controller zurückkehren - , aber unsere tatsächlichen Daten werden noch nicht aktualisiert!
Ein Handler, iHandle < PaymentMethodRemovedMessage>, das Ereignis hört und entfernt die aktuelle Zeile aus der DB
Also, was ist ein Kerl zu tun?
Ich könnte einfach sagen, entfernen Sie das Div, das die Zahlungsmethode angezeigt wurde. Dies funktioniert möglicherweise in einem AJAX-Szenario, aber was ist, wenn ich Post-Redirect-Get zur Unterstützung von Nicht-JavaScript-Clients verwende? Dann feuere ich meine Get und lese die Daten von der Abfrageseite der Dinge, möglicherweise bevor sie aktualisiert wird.
Zeige ich einfach eine Benachrichtigung, dass ihre Anfrage zum Entfernen der Zahlungsmethode eingereicht wurde? (was nicht nett zu sein scheint, ist sinnvoll, um eine Bestellung zu übermitteln, aber nicht zum Beispiel um eine Adresse zu ändern).
Gibt es eine Möglichkeit, implementierende Änderungen als entkoppelte asynchrone Ereignisse abzustimmen und die Benutzerdaten anzuzeigen, die ihre aktuelle Änderung widerspiegeln?
EDIT: Meine Frage ist sehr ähnlich zu CQRS, DDD synching reporting database ich zu sagen habe, die Antwort gibt und auch hier gegeben erwähnt, hat ein bisschen von einem Geruch zu ihm - Gerangel der UI-Update zu zeigen, die mit aus Band die DB lesen, sozusagen. Ich hoffte auf etwas saubereres.