CQRS - So modellieren Sie ein Szenarioausführungssystem

8

Ich habe vor kurzem begonnen, CQRS und DDD für ein grünes Feldprojekt zu untersuchen, das ich gerade beginne. Ich habe sehr viel Material von Udi Dahan, Greg Young, Mark Nijhof und anderen studiert. Diese waren wirklich sehr hilfreich und ich denke, dass ich die Konzepte gut verstehe. Aber es gibt immer noch einige Fragen, wie ich diese auf meine eigene Domain anwenden kann.

Mein System wird im Grunde eine komplexe Regel-Engine sein - in der Regeln den Endpreis bestimmter Produkte bestimmen werden. Die Produktdefinitionen und Regeln werden von Administratoren in das System eingegeben. Regeln werden von Administratoren entworfen, die eine vordefinierte Gruppe von Eigenschaften verwenden, die Werte aus einer vordefinierten Gruppe enthalten können, z. B. Kaufzweck (Wiederverkauf, Vermietung) oder Freiformwerte wie Alter .

Jedes Produkt hat einen Grundpreis, und Regeln werden grundsätzlich zum Basispreis hinzugefügt / entfernt, wenn sie angewendet werden.

Eine sehr einfache Beispielregel könnte sein:

Für Produkt X, IF (Kaufzweck = Weiterverkauf und Alter & gt; 25) 25 $ zum Grundpreis hinzufügen.

Also gibt es zwei Arten von Benutzern, die das System benutzen, Administratoren, die die Produkte, Regeln und Basispreise definieren; und andere Benutzer, die Preise basierend auf einem Szenario abfragen, das sie über eine Was-wäre-wenn-UI eingeben.

Meine Verwirrung hier ist: Die Ausführung eines Szenarios ändert den Status der Domäne überhaupt nicht, kein anderes externes System / Person ist am Ergebnis der Szenarioausführung interessiert, sondern der laufende Benutzer selbst - es gibt das Ergebnis zurück einer Preisberechnung nach dem Ausführen der anwendbaren Regeln für das gegebene Szenario. Der Benutzer könnte beispielsweise Produkt X auswählen und die Preisfindung für ein bestimmtes Szenario abfragen, beispielsweise (Kaufzweck = Weiterverkauf und Alter = 40) . Da diese Operation den Domänenstatus überhaupt nicht ändert, denke ich, dass es sich um eine Abfrage handelt. Aber es gibt eine Regel-Engine, die mit dem Szenario arbeitet, um den Endpreis zu berechnen, was ich als Domain-Logik bezeichnen kann, die ausgeführt wird. Also - wo gehört diese Logik? Ist dies eine Abfrage, die nur vom Lesemodell ausgeführt wird, oder führt ein Szenario einen Befehl aus, der im Domänenmodell ausgeführt werden muss? Auch hier fühlt es sich an, als ob der Domänen-Layer der richtige Platz für diese Regeln wäre. Aber wie gebe ich das Ergebnis der Szenario-Ausführung an den Benutzer weiter (fühlt sich an wie eine Abfrage, die so darüber nachdenkt). Oder vielleicht ist CQRS nicht die richtige Lösung für dieses spezielle Problem?

    
KaanK 14.01.2011, 07:02
quelle

2 Antworten

4

Ich hatte genau dieses Problem in meiner eigenen Domain (e-Scheduling 4 healthcare). Grundsätzlich wird das System mit einem Domänenmodell (Schreibseite) konfiguriert. Dies würde Regeln, Produkte und Basispreise in Ihrer Domain definieren. Was kommt aus der Domain? Ereignisse, Zustandsänderungen, Dinge, die zusammen mit dem passiert sind, warum es passiert ist. Nun, was ich getan habe, war, diese Ereignisse in einem anderen beschränkten Kontext zu konsumieren, in meinem Fall eine komplexe Suchmaschine, die freie Plätze in den Zeitplänen von Ärzten, Operationssälen und teuren Geräten findet. Dies könnte eine Route sein, die Sie auch nutzen könnten, indem Sie Ihr Produkt, den Basispreis und regelbezogene Ereignisse konsumieren und sie so speichern, dass die Regelengine, die auf diesen Daten sitzt, Benutzeranfragen für Szenarien ebenso effizient verarbeiten kann möglich. Sehr wahrscheinlich werden Sie feststellen, dass das Modell zum Speichern von Änderungen (Domäne) sich von dem Modell unterscheidet, das für die Abfrage dieser Was-wäre-wenn-Szenarien (Regel-Engine) optimiert wurde. Ihre Domain wird wahrscheinlich Regeln haben wie "Sie können nicht dasselbe Produkt zweimal angeben" oder "diese Regel wird niemals angepasst werden (Alter & lt; 25 & amp; & amp; age & gt; 25)". Die Domäne befasst sich nur mit gültigen Statusänderungen. Dies ist kein Problem der Regelengine. Sie werden versucht sein, Konzepte / Klassen in Ihrer Regelengine wiederzuverwenden, die in der Domäne definiert sind. Widerstehen Sie diesem Drang. Frage, ob sie wirklich dem gleichen Zweck dienen. Es zweimal für einen anderen Zweck zu modellieren ist nicht schmutzig oder eine Verletzung von DRY.

    
Yves Reynhout 15.01.2011 12:58
quelle
0

CQRS gibt nichts darüber aus, dass im Abfrageteil der Anwendung keine Domänenlogik vorhanden sein sollte. Wenn es möglich und praktisch ist, dann ist es in Ordnung, getrennte denormalisierte Abfragespeicher für jeden Aspekt oder sogar für die Abfrage Ihrer Anwendung zu haben, aber natürlich ist es nicht notwendig.

Kurz gesagt, eine Abfrage ist eine Abfrage, egal wie komplex die Aufgabe ist, ihre Antwort zu finden.

    
Sebastian Ganslandt 19.06.2011 12:59
quelle

Tags und Links