Je commence par DDD et je comprends que les racines agrégées sont utilisées pour assurer la cohérence transnationale. Nous ne devons pas modifier plusieurs agrégats dans un seul service d'application.
Je voudrais cependant savoir comment faire face à la situation suivante.
J'ai une racine agrégée appelée Produits.
Il existe également une racine agrégée appelée Group.
Les deux ont des identifiants et peuvent être modifiés indépendamment.
Plusieurs produits peuvent pointer vers le même groupe.
J'ai un service d'application qui peut changer le groupe d'un produit:
ProductService.ChangeProductGroup(string productId, string groupId)
- Vérifier que le groupe existe
- Obtenir le produit du référentiel
- Définir son groupe
- Réécrire le produit dans le référentiel
J'ai également un service d'application où le groupe peut être supprimé:
GroupService.DeleteGroup(string groupId)
1. Obtenez les produits du référentiel dont groupId est défini sur groupId fourni, assurez-vous que le nombre est 0 ou abandonnez 2. Supprimez le groupe du référentiel de groupes 3. Enregistrez les modifications
Ma question est le scénario suivant, que se passerait-il si:
Dans ProductService.ChangeProductGroup, nous vérifions que le groupe existe (il le fait), puis juste après cette vérification, un utilisateur distinct supprime le productGroup (via l'autre GroupService.DeleteGroup). Dans ce cas, nous avons défini une référence à un produit qui vient d'être supprimé?
Est-ce un défaut dans ma conception dans la mesure où je devrais utiliser une conception de domaine différente (en ajoutant des éléments supplémentaires si nécessaire), ou devrais-je utiliser des transactions?