J'ai besoin d'aide pour trouver ma racine et ma limite globales.DDD: Racines agrégées
J'ai 3 entités: Plan, PlannedRole et PlannedTraining. Chaque plan peut inclure plusieurs rôles planifiés et planifiés.
Solution 1: J'ai d'abord pensé que Plan était la racine agrégée parce que PlannedRole et PlannedTraining n'ont pas de sens dans le contexte d'un Plan. Ils sont toujours dans un plan. En outre, nous avons une règle de gestion qui stipule que chaque plan peut avoir un maximum de 3 rôles planifiés et de 5 plans de formation. J'ai donc pensé en nommant le Plan comme la racine agrégée, je peux imposer cet invariant.
Cependant, nous avons une page de recherche où l'utilisateur recherche des plans. Les résultats montrent quelques propriétés du Plan lui-même (et aucun de ses PlannedRoles ou PlannedTrainings). Je pensais que si je devais charger tout l'agrégat, cela aurait beaucoup de frais généraux. Il y a près de 3000 plans et chacun peut avoir quelques enfants. Charger tous ces objets ensemble, puis ignorer PlannedRoles et PlannedTrainings dans la page de recherche n'a aucun sens pour moi.
Solution 2: Je viens de réaliser que l'utilisateur veut 2 autres pages de recherche où il peut rechercher des rôles planifiés ou des formations planifiées. Cela m'a fait réaliser qu'ils essaient d'accéder à ces objets indépendamment et «hors» du contexte de Plan. J'ai donc pensé que j'avais tort sur ma conception initiale et c'est ainsi que j'ai trouvé cette solution. Donc, je pensais avoir 3 agrégats ici, 1 pour chaque Entité.
Cette approche me permet de rechercher indépendamment chaque Entité et résout également le problème de performance dans la solution 1. Cependant, en utilisant cette approche, je ne peux pas appliquer l'invariant que j'ai mentionné précédemment.
Il existe également un autre invariant qui indique qu'un Plan ne peut être modifié que s'il a un certain statut. Donc, je ne devrais pas être en mesure d'ajouter des PlannedRoles ou des PlannedTrainings à un plan qui n'est pas dans ce statut. Encore une fois, je ne peux pas imposer cet invariant avec la seconde approche.
Un conseil serait grandement apprécié.
Cheers, Mosh
Salut David, Merci pour ta réponse. Semble être une bonne idée! Oui, j'ai lu quelque chose de similaire quelque part avant mais l'auteur n'a pas creusé dans les détails de ceci. Je crois que les résultats de la recherche ressemblent plus à un rapport et qu'il ne vaut pas la peine de lire l'ensemble de l'agrégat à des fins de rapport, puisque les données sont en lecture seule. Nous ne ferons aucun changement, donc aucun invariant ne devrait être appliqué, donc aucun agrégat n'est requis! Bonne idée! :) Avez-vous des exemples d'implémentation? Ou connaissez-vous des pages Web qui en parlent plus? – Mosh
OK, j'ai ajouté un exemple à ma réponse - j'espère que cela vous donne quelques idées! J'ai peur de ne pas connaître de liens, car j'ai moi-même trouvé cette implémentation après avoir posté cette question :) P.S. Si cela vous a aidé à résoudre votre problème, n'oubliez pas de marquer ceci comme la réponse: D –
Grande implémentation! Tu es un génie David! Merci mec. – Mosh