Ich beginne mit DDD und verstehe, dass aggregierte Wurzeln verwendet werden, um die transnationale Konsistenz sicherzustellen. Wir sollten nicht mehrere Aggregate in einem Anwendungsdienst ändern.
Ich würde jedoch gerne wissen, wie ich mit der folgenden Situation umgehen soll.
Ich habe eine aggregierte Wurzel namens Produkte.
Es gibt auch eine aggregierte Wurzel namens Group.
Beide haben IDs und können unabhängig voneinander bearbeitet werden.
Mehrere Produkte können auf dieselbe Gruppe verweisen.
Ich habe einen Anwendungsdienst, der die Gruppe eines Produkts ändern kann:
ProductService.ChangeProductGroup(string productId, string groupId)
- Prüfgruppe existiert
- Produkt aus dem Repository holen
- Stellen Sie die Gruppe ein
- Schreiben Sie das Produkt zurück in das Repository
Ich habe auch einen Anwendungsdienst, bei dem die Gruppe gelöscht werden kann:
GroupService.DeleteGroup(string groupId)
1. Rufen Sie Produkte aus dem Repository ab, dessen Gruppen-ID auf die angegebene Gruppen-ID festgelegt ist, stellen Sie sicher, dass die Anzahl 0 ist, oder brechen Sie ab. 2. Löschen Sie die Gruppe aus dem Gruppen-Repository. 3. Speichern Sie die Änderungen
Meine Frage ist das folgende Szenario, was würde passieren, wenn:
In der ProductService.ChangeProductGroup überprüfen wir, ob die Gruppe vorhanden ist (dies ist der Fall). Unmittelbar nach dieser Überprüfung löscht ein separater Benutzer die productGroup (über die andere GroupService.DeleteGroup). In diesem Fall setzen wir einen Verweis auf ein Produkt, das gerade gelöscht wurde?
Ist dies ein Fehler in meinem Design, da ich ein anderes Domain-Design verwenden sollte (ggf. zusätzliche Elemente hinzufügen), oder müsste ich Transaktionen verwenden?