2010-12-31 8 views
6

Ich habe CQRS betrachtet, aber ich finde es einschränkend, wenn es darum geht, das Ergebnis von Befehlen in einer Webanwendung anzuzeigen.Welches Ergebnis liefert eine Befehlsanforderung im CQRS-Design?

Es scheint mir, dass mit CQRS gezwungen ist, die gesamte Ansicht oder Teile davon zu aktualisieren, um die Änderungen zu sehen (mit einer zweiten Anfrage), weil die ursprüngliche Befehlsanforderung nur ein Ereignis speichert, das verarbeitet werden soll Zukunft.

In einer Webanwendung ist es möglich, dass eine Befehlsanforderung das Ergebnis des Ereignisses, das es erstellt, an den Browser übertragen wird?

Antwort

6

Die Antwort auf die Überschrift dieser Frage ist ganz einfach: nichts, leer oder aus einem Webbrower/Ruhe Sicht 200 OK mit einem leeren Körper.

Befehle, die auf das System angewendet werden (wenn die Änderung erfolgreich festgeschrieben wurde), führt nicht zu einem Ergebnis. Und falls Sie die Geschäftslogik auf der Serverseite belassen möchten, müssen Sie die Daten aktualisieren, indem Sie eine weitere Anfrage (Abfrage) an den Server ausführen.

Am häufigsten können Sie jedoch den 2. Roundtrip zum Server loswerden. Nehmen Sie eine Tabelle, in der Sie eine Zeile ändern und drücken Sie eine Schaltfläche zum Speichern. Müssen Sie die Tabelle wirklich aktualisieren? Oder wenn ein Benutzer einen Kommentar zu einem Blogeintrag abgibt, fügen Sie einfach den Kommentar zu den anderen Kommentaren im Dom ohne die Rundreise hinzu.

Wenn Sie wünschen, dass der modifizierte Status vom Server zurückgegeben wird, müssen Sie sich genau überlegen, was Sie erreichen möchten. Die meisten Szenarien können geändert werden, sodass ein einfaches 200 OK mehr als genug ist.

Update: In Bezug auf Ihre Frage zur Warteschlange eingehende Befehle. Es wird nicht empfohlen, dass eingehende Befehle in die Warteschlange gestellt werden, da dies falsche positive Ergebnisse liefern kann (ein Befehl wurde erfolgreich empfangen und in die Warteschlange gestellt, aber wenn der Befehl versucht, den Status des Systems zu ändern, schlägt er fehl). Es gibt eine Ausnahme von der Regel, und zwar wenn Sie ein System mit einem Append-Only-Modell als Status haben. Dann ist es sicher, die Mutation des Systemzustands bis zu einem späteren Zeitpunkt einzureihen, wenn der Befehl gültig ist.

Udi Dahans Artikel Geklärte CQRS genannt ist immer ein gutes Buch zu diesem Thema http://www.udidahan.com/2009/12/09/clarified-cqrs/

+0

Interessante Antwort Tim, Danke. Ich sehe die Weisheit bei der Verwendung von CQRS zur Implementierung von Befehlen, die kein sofortiges Ergebnis benötigen. Das Problem des Aktualisierens des DOM, das den Befehl erwartet, wird sich schließlich einstellen, weil es dem Benutzer schwer fällt, zu sagen, dass der Befehl nicht erfolgreich war. Vielleicht hat der Benutzer die Seite bereits verlassen und denkt, dass seine Eingabe wirksam ist. Ich kann nicht sehen, wie CQRS verwendet werden kann, um dieses Problem zu lösen, wenn alle Befehle void zurückgeben sollen. – Roman

+0

Die Befehle müssen immer den Status Ihres Systems ändern, wenn sie gesendet werden. Die Verschiebung dieser Art von Arbeit kann zu ungültigen Änderungen des Systemstatus führen, die dem Benutzer einen falschen positiven Wert geben, wenn Sie darauf hinweisen. Eingehende Befehle in die Warteschlange zu stellen ist nicht der richtige Weg, es sei denn, Sie arbeiten nur mit einem Append-Modell als Status Ihres Systems! Jetzt, da der Status durch den übergebenen Befehl geändert wird, ist es sicher, die Benutzeroberfläche im Webbrowser zu ändern. Andere Dinge wie denormalisierte Ansichten Ihrer Daten, Aggregation von Daten, etc., die Ihre Abfragen ausgleichen, können bis später abweichen. –

+5

"Die meisten Szenarien können geändert werden, so dass ein einfaches 200 OK mehr als genug ist." Ich würde sagen, dass das Gegenteil der Fall ist. Die meisten Operationen benötigen die ID des neu erstellten Elements, um weitere Operationen für sie auszuführen. –