Ich habe ein Designproblem, das sich seit einiger Zeit in meinem Kopf herumdreht und ich finde keine gute Lösung dafür. Es geht um CQRS und Domänengrenzen.Zusätzliche Begrenzungsdaten bei der Befehlsausführung
Angenommen, ich habe einen Kontext, in dem es darum geht, Buchungen und folglich Ereignisse für ein System zu übernehmen. Das System ermöglicht es, eine einzelne Buchung mit einem einzelnen Ereignis zu verknüpfen (das ist bereits erledigt, keine Probleme) und wöchentliche Buchungen, die mit einer Sammlung von Ereignissen verknüpft sind. Wöchentliche Buchungen werden mit einem Wochentag vorgenommen (zusätzliche Daten sind nicht relevant); Eine wöchentliche Buchung hat immer einen Anfangs- und Endtag (ein halbes Jahr).
Das System hat auch zwei Arten von Tagen: normale Tage und keine Arbeitstage, an denen ein Ereignis nicht stattfinden kann.
Als Geschäftsanforderung möchten die Benutzer, dass das System für jede wöchentliche Buchung nur solche Ereignisse storniert, die nicht an Werktagen gehalten werden.
Tatsächlich werden Buchungen und Ereignisse in zwei Tabellen gespeichert. Ein Ereignis wird abgebrochen, wenn es mit einem speziellen Flag gespeichert wird. Ich habe keine Verbindung mit der Tabelle der Tage, weil ich sie nie in meinem Geschäftskontext verwendet habe. Als Geschäftsgrenze (mit anderen kleinen Daten, hier nicht relevant) funktionierte das bisher großartig.
Hier ist mein Problem: Um die Benutzeranforderung zu erfüllen (erstellen Sie eine Veranstaltung für jeden gelöschten Tag), brauche ich Informationen über alle Tage des halben Jahres (nur diejenigen am selben Wochentag sind genug). Aber um diese Informationen zu erhalten, wie kann ich fortfahren?
Meine mögliche Lösungen:
- laden alle Tage Halbjahr in der Root-Entität. Das könnte sehr schwer sein, und ich muss meine Geschäftsgrenze erweitern.
- Den Befehl vorverarbeiten und einen mit zusätzlichen Informationen erstellen. Es wäre ein Befehlsbefehl, etwas, von dem ich gelesen habe, dass es gefährlich ist. Das ist genug für mich.
- Erweitern Sie den Befehl mit der Liste der ungültigen Tage. Wie überprüfe ich, dass ein Tag ungültig ist? Ich muss auf Daten außerhalb meiner tatsächlichen Grenze zugreifen, das ist das gleiche wie 1.
- Erstellen Sie einen Dienst, der im Befehlshandler verwendet wird, um die Liste der nicht arbeitenden Tage abzurufen. Die Tageskontextinformationen würden in einem gemeinsamen (oder gemeinsamen) Kontext verschoben werden.
- Erstellen Sie einen Ereignis-Listener für wöchentliche Ereignisse. Wenn ein wöchentliches Ereignis erstellt wird, lädt es die Liste der nicht arbeitenden Tage (für diesen Wochentag dieses halben Jahres) und löst eine Folge von Befehlen aus, um diese bestimmten Tage abzubrechen. Dies würde die Grenzen versiegeln, keine zusätzlichen Daten zu einem gemeinsamen Kontext hinzufügen und denselben Code für zusätzliche Zwecke wiederverwenden (Ereignis abbrechen).
Welche wäre die beste Lösung?
Daher, wenn ich Ihren Vorschlag richtig verstanden habe, ist die letzte Option die beste. Zwei Aggregate mit zwei verschiedenen Zwecken und ein Ereignis-Listener, der die wöchentliche Buchung mit der Liste der nicht erlaubten Ereignisse "aktualisiert". –