Lorsque vous suivez la conception pilotée par domaine (DDD), est-il correct qu'un agrégat racine contienne une référence à une entité interne qui se trouve être l'entité racine sur un agrégat distinct?
Je crois que ce n'est pas correct, principalement à cause de cette règle sur le livre bleu :
Rien en dehors de la limite AGGREGATE ne peut contenir de référence à quoi que ce soit à l'intérieur, sauf à la racine ENTITY. L'ENTITY racine peut transmettre des références aux ENTITIES internes à d'autres objets, mais ces objets ne peuvent les utiliser que de manière transitoire et ils peuvent ne pas conserver la référence. La racine peut remettre une copie d'un OBJET DE VALEUR à un autre objet, et peu importe ce qui lui arrive, car c'est juste une VALEUR et n'aura plus aucune association avec l'AGGREGATE.
Si un agrégat racine contient une référence à un autre agrégat racine, la limite de l'ancien est violée et le concept entier d'un agrégat est corrompu, donc je crois que si un agrégat racine semble avoir besoin de contenir une référence à un autre agrégat racine, alors j'ai besoin pour créer une entité différente , qui partagera probablement certains des mêmes membres que l'autre entité racine, mais n'aura pas d'identité globale, comme l'indique cette autre règle dans le livre:
Les ENTITÉS racine ont une identité mondiale. LES ENTITÉS à l'intérieur de la frontière ont une identité locale, unique au sein de l'AGRÉGAT.
Je crois que ce serait la bonne façon de procéder, mais comme cela semble répétitif et redondant (lorsqu'il est retiré du contexte de DDD, avec de la POO pure), je demande des commentaires.
la source
Réponses:
Vous pourriez surinterpréter le livre. Il dit essentiellement: tout ce qui se trouve à l'extérieur d'un agrégat ne peut contenir de référence à rien à l'intérieur, à l'exception de la racine. Par conséquent, détenir une référence à une racine est légitime. Tenir une référence à une racine ne signifie pas qu'elle fait partie de votre propre agrégat et que vous pouvez contrôler ses invariants. Il garde ses propres invariants et son autonomie.
cependant,
Cela n'arrive jamais. Un objet de valeur peut faire partie de plusieurs agrégats, mais pas d'une entité. La raison en est que rien ne vous empêcherait alors de partager la même instance d' entité entre des agrégats. Disons que l'instance d'entité E appartient aux instances d'agrégation A et B. Étant donné que la prémisse de DDD est que l'agrégat est le point d'entrée, vous seriez en mesure de charger A, de modifier l'entité E à travers elle, tout en violant silencieusement les invariants de B (que vous n'avez pas chargé).
Voir la réponse de Greg Young ici: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html
la source
holding a reference
dans ce contexte? parce que je me suis trompé quand vous avez dit cela:holding a reference to a root is legit
ensuite vous avez dit:This never happens. A Value Object can be part of multiple Aggregates, but not an Entity. The reason is, nothing would then prevent you from sharing the same entity instance between Aggregates.
id
entité interne (non-root) dans un autre agrégat ou cela viole si (root ou non)?Votre objet racine agrégé ne doit (généralement) avoir que des propriétés qui font partie de son domaine.
Si vous avez un objet AR avec une propriété qui n'est pas dans l'ensemble, vous êtes immédiatement confronté à la question. 'Pourquoi pas?'
Vous pourriez peut-être ajouter l'ID de l'autre objet? Ou injecter un référentiel?
Mais il semble que vous devez ajouter un service interdomaine qui référence les deux objets racine et exécute la logique requise
la source