2010-08-05 5 views
6

Ich habe das folgende Szenario, das ich nach dem CQRS Muster implementieren müssen:CQRS - Eventual Consistency

  1. ein Benutzer anmeldet
  2. der Benutzer gibt einige Versicherungs Details
  3. der Benutzer für eine Entscheidung bitten
  4. angewendet
  5. der Benutzer sieht das Ergebnis der Entscheidung

Dies scheint ziemlich einfach, aber meine probl werden em ist zwischen Schritt 3 und 4, in Schritt 3 sende ich einen ApplyForDecision Befehl, der eine Entscheidung von einem Underwriting-Service erhalten wird, ein Ereignis mit dem Ergebnis dieser Entscheidung wird dann an den BUS für den gelesenen Speicher gesendet, um ihn später zu verbrauchen und zu aktualisieren die View-Tabellen mit dem Entscheidungsergebnis. Das Problem ist auf der Benutzeroberfläche, wie kann ich den Benutzer wissen lassen, dass die Entscheidung angewendet wird, da in CQRS das gelesene Modell nicht "sofort" aktualisiert wird, wie mache ich die UI zeigen, dass eine Entscheidung in Bearbeitung ist und wird 'bald' ankommen?

Ich muss dem Benutzer auch die Möglichkeit geben, sich abzumelden und wieder einzuloggen, da die Entscheidung möglicherweise noch nicht angewendet wurde. Wie mache ich die Benutzeroberfläche mit dem "ausstehende Entscheidungsbildschirm"?

+0

Ist die Benutzeroberfläche der Webclient oder ein Smart Client? – stung

+1

Wird der Status in irgendeiner Weise geändert? Ich meine, ist diese Entscheidung Anwendung einer Form der Berechnung, die bestätigt werden muss? Wenn ja, ist das für die "anderen" im System sichtbar? Wie ist dieses Szenario sehr kooperativ? –

Antwort

3

IMHO die Lösung wäre, lassen Sie Ihren Befehl ein "ApplyForDecisionRequested" und ein "ApplyForDecisionHandled" -Ereignis emittieren, und aktualisieren Sie Ihr Lesemodell entsprechend.

7

Die Antwort besteht darin, sofort ein Ereignis auszulösen, das anzeigt, dass die Entscheidung beantragt wurde, die gelesene DB zu aktualisieren und direkt zu Ihrem anstehenden Entscheidungsbildschirm umzuleiten, ob die gelesene DB bis zu diesem Zeitpunkt aktualisiert wurde. Statischer Text 'Ausstehende Entscheidung, dass Sie kontaktiert werden' oder etwas in dieser Richtung. Sie können aktualisieren oder später wiederkommen und mehr als wahrscheinlich werden die echten Daten erhalten. Dann, wenn die Entscheidung entschieden wurde, haben Sie ein DecisionMade-Ereignis und aktualisieren die gelesene DB, senden E-Mails aus, was auch immer der Fall ist.

Das ist der Kompromiss mit der Konsistenz, mit der Sie in CQRS umgehen müssen. Wenn ich Änderungen an den Eigenschaften von Domänenobjekten in einem Formular vorgenommen habe, täusche ich es oft in der unmittelbaren Rückmeldung, die der Benutzer erhält, während das Backend seine Aufgaben erledigt. Ja, ein bisschen hässlich, aber die User wissen das nicht.

+2

Gute Antwort, vor allem über den Benutzer nicht zu wissen. Das ist der Schlüssel, stellen Sie sicher, dass der Benutzer nichts bemerkt. Beispielsweise könnten Sie im Browser oder Server-Cache speichern, dass das Element aktualisiert wurde. Wenn Sie auf das Readmodel für Daten und in Ihrem Cache zugreifen, stellen Sie fest, dass die Daten noch nicht aktualisiert wurden. Sie tun dies selbst, aber nur für diesen Benutzer. SignalR ist auch ideal, um andere Clients so schnell wie möglich zu aktualisieren. –

Verwandte Themen