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?
Warum speichern Sie die Produkt-IDs nicht in der Gruppenentität? Auf diese Weise haben Sie es nur mit einem einzigen Aggregat zu tun, was die Sache einfacher macht.
Sie müssen dann eine Art Parallelitätsmuster implementieren, z. B. Wenn Sie eine optimistische Parallelität wählen, fügen Sie der Gruppenentität einfach eine Versionseigenschaft hinzu und lösen Sie eine Ausnahme aus, wenn die Versionen beim Aktualisieren nicht übereinstimmen, d. H.
Produkt zu einer Gruppe hinzufügen
In vielen ORMs ist eine optimistische Parallelität mithilfe von Versions-IDs oder Zeitstempeln integriert, aber es ist einfach, eigene Rollen zu erstellen. Hier ist ein guter Beitrag darüber, wie es in Nhibernate gemacht wird: http://ayende.com/blog/3946/nhibernate-mapping-concurrency .
quelle