Es gibt eine Menge Meinungen bezüglich CQRS mit DDD und was jede Komponente ausmacht. Ich habe noch nicht damit begonnen, sich mit Event Sourcing zu beschäftigen, daher enthält die folgende Liste nichts, was damit zu tun hat. Obwohl Einblicke in ES wäre interessant.
Bisher habe ich die folgenden Komponenten mit zugehörigen Verantwortlichkeiten (siehe unten). Ich habe einige Fragen in die unten stehenden Punkte eingefügt.
REST-Endpunkte / Anwendung
AggregateId orderId = AggregateId.get (); AggregateId userId = finder.findUserAggregateIdByEmail (E-Mail); dispatcher.fire (neuer CreateOrderCommand (orderId, userId, orderItems));
Befehl
new CreateOrderCommand( orderId, userId, orderItems );
Befehlshandler
Aggregatfabrik
factory.createOrder( orderId, userId, orderItems );
Aggregatwurzel / Aggregate
order.cancel();
Domänenservice
Repository
repo.load(orderId);
Ereignis
new OrderCancelledEvent( orderId );
Ereignishandler
Saga
Finder
finder.findOrdersOnDate( date );
Infrastrukturdienste
Frage
Ist das eine genaue Zusammenfassung der Komponenten vs. Verantwortlichkeiten? Was fehlt und was sollte bewegt werden? Ich kann die Liste mit relevanten Antworten aktualisieren.
Wie Sie sagten, gibt es viele Meinungen, und Sie müssen sie filtern, da die Leute meistens Meinungen abgeben, ohne Erfahrung in dieser Angelegenheit. CQRS ist ein großes Thema und ich denke nicht, dass Sie ohne vorherige Erfahrung in DDD und ES einsteigen sollten. Dienste sollten gut und klar definiert sein. Wenn Sie diesen Prinzipien folgen, können Sie verschiedene Implementierungen in Ihrer Domäne haben. Beginnen Sie also mit CQRS und fügen Sie DDD / ES den folgenden Diensten hinzu, sobald Sie CQRS beherrschen.
Ich würde Ihnen raten, den CQRS-Teil Ihrer Architektur zu erstellen, ein Gateway für die Befehle und eines für die Abfragen, weil das üblich ist und nur so viele Entscheidungen getroffen werden müssen:
Rest-API
Nachrichtenverträge / Validierung
Lesen Sie Modelle ...
und beginnen Sie, Ihren Dienst auf traditionelle Weise ohne DDD zu implementieren, indem Sie nur das Repository-Muster verwenden. Wenn Sie anfangen, sich sicher zu fühlen, dann können Sie vielleicht DDD in Bezug auf Aggregate und später auf ES springen. Sie können die anfänglichen Dienste jederzeit zu einem späteren Zeitpunkt ändern.
Mein Rat wäre, nicht zu versuchen, alles auf einmal zu tun, weil Sie versagen werden; Ich habe es schon oft gesehen.
Zum Beispiel: Warten auf OrderShipped und OrderReceived events = & gt; fire CancelOrderCommand Warte auf OrderCancelled = & gt; Feuerauftrag stornierte E-Mail
Sagas sollte keine Ereignisse (Saga-Muster) veröffentlichen, aggregierte Ereignisse sagen und Befehle senden. Die Tatsache, dass Frameworks wie NServiceBus es Sagas erlauben, Ereignisse zu veröffentlichen, hilft nicht, also sei dir bewusst.
Single (Lesen + Schreiben) Normalisiertes Datenbankmodell: Der Finder kann andere Finder (über Kontexte) aufrufen, um verschachtelte Objekte zu erfüllen
Welche anderen Kontexte möchten Sie in Ihren Lesemodellen haben?
%Vor%Infrastrukturdienste
Nicht sicher, was Sie damit meinen, aber es sieht nicht richtig aus. Nachrichtenwarteschlange oder Datenbankdienst?
Tags und Links design-patterns domain-driven-design cqrs