2009-12-10 15 views
21

Einer der grundlegenden Grundsätze von CQRS, wie ich es verstehe, ist, dass Befehle sollten verhaltensorientiert sein, und haben einen Wert in der Geschäfts-oder UL, und nicht datenzentriert, dh CRUD . Anstatt sich auf die Aktualisierung eines Kunden zu konzentrieren, haben wir Befehle wie CustomerHasMoved. Was ist, wenn Sie CRUD-Bildschirme haben, die bestimmte Daten korrigieren sollen? Zum Beispiel müssen wir den Namen eines Kunden ändern, der falsch geschrieben ist. Das hat im Geschäft nicht wirklich viel Wert. Sollte dies nur unter dem Schirm eines UpdateCustomer-Befehls stehen?CQRS und CRUD Bildschirme

+4

Wie hat der richtige Kundenname keinen Wert für das Geschäft? Wenn der Name falsch eingegeben wird, kann dies bedeuten, dass die Ware nicht geliefert wird und es andere Szenarien gibt ... – Oded

Antwort

17

Eigentlich könnte es verschiedene Gründe geben, den Namen eines Kunden zu aktualisieren. Wie du gesagt hast, könnte es falsch geschrieben sein oder ... du könntest heiraten und deinen Namen in den deines Ehemannes ändern.

Wenn Sie nur einen UpdateCustomer-Befehl hätten, würden Sie die ursprüngliche Absicht verlieren und Sie wären nicht in der Lage, unterschiedliche Verhaltensweisen für jede von ihnen zu haben. Wenn der Name falsch angegeben wurde, kann es einfach sein, die Datenbank zu aktualisieren. Wenn Ihr Kunde jedoch verheiratet ist, müssen Sie möglicherweise die Marketingabteilung benachrichtigen, damit sie einen Rabatt anbieten kann.

Wenn Ihre Entity eine reine CRUD ist, dh wenn Sie keine Absicht mit der Änderung der Eigenschaften verknüpfen können, ist es in Ordnung, einen UpdateEntityCommand zu haben. Sie können dann langsam auf etwas aufgabenbasierter übergehen

+1

Genau, was soll man tun? Erstellen Sie einen Befehl für jedes einzelne mögliche Szenario? – blockhead

+7

Ja, oder zumindest für jedes Szenario, das Sie behandeln möchten. In meinem Beispiel würden Sie mit CorrectMisspelledCustomerName beginnen und später bei Bedarf einen MakeCustomerMarried-Befehl hinzufügen. CQRS ist über Verhalten, nicht über die Aktualisierung von Daten. Daher sollten Sie keine allgemeinen Befehle zum Aktualisieren von Inhalten in Ihrem System haben. – Julien

+0

Was wäre, wenn ich einen großen Bildschirm mit allen Feldern für meinen Kunden hätte. Würde ich mehrere Befehle abfeuern, um damit umzugehen, oder mir irgendwie ein "Verhalten" einfallen lassen? Vielleicht sollte ich einfach nie alle Felder zeigen. – blockhead

0

CustomerHasMoved ist das Ereignis, das ausgelöst wird, nachdem Sie den Standort des Kunden aktualisiert haben. Dieses Ereignis aktualisiert die gelesenen Datenbanken/Cache-Datenbanken. Der Befehl von der GUI sollte MoveCustomer oder etwas in der Art sein. Ich denke, ich würde das Update des Kundennamens in einen Befehl wie UpdateCustomer setzen.

37

Ich möchte nur einen Kommentar dazu schnell wie es auftauchte.

Es ist wichtig zu beachten, dass einige Objekte tatsächlich CRUD sind und das ist ok. Es interessiert mich vielleicht nicht wirklich, warum sich ein Name in meiner Domain ändert, wo ich Produkte an Leute verschicke und diese Daten nur brauche, um Adressetiketten zu drucken. Der Trick besteht darin, das Verhalten zum Standard zu machen und DANN zu einer CRUD-Schnittstelle zurückzukehren, sobald Sie sicher sind, dass Sie sich nicht wirklich für die Gründe interessieren, im Gegensatz zu umgekehrt.

Greg

+0

Danke für Ihre Eingabe @Greg. Ich habe überall gegoogelt, um zu sehen, was Sie über diese Art von CRUD-Szenarien zu sagen hatten. Ich denke, die gelegentliche CRUD ist immer noch in der Lage, in einem DDD-Ansatz zu verwenden, solange es absolut kein Verhalten gibt, das Sie damit erfassen möchten. –

+0

Upvote. Wir geben hier Geld aus, um Funktionalität zu bekommen (mit Wartbarkeit als zweitem). Will etwas perfekt und schön machen, sei ein Künstler. Werde auch wie einer bezahlt. Siehe meinen Kommentar zu Juliens Antwort. – FastAl