DDD: est-il correct qu'un agrégat racine contienne une référence à un autre agrégat racine?

16

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.

Lesair Valmont
la source
Qu'entendez-vous par «entité interne (qui se trouve être l'entité racine sur un agrégat séparé)»?
Erik Eidt
2
FWIW, Tout peut faire référence à une entité racine agrégée car ce sont les choses ayant une identité globale; que le référent soit lui-même une entité racine ou non est sans importance.
Erik Eidt
Comme l'a dit Erik. En outre, peu importe que vous le référençiez à l'aide d'un ID ou d'une référence dans votre modèle. Il convertira tous les deux en ID au niveau de la base de données et le fait d'avoir une référence donne à ORM la possibilité de charger paresseusement l'entité à la demande.
Euphoric

Réponses:

21

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,

  • Une bonne pratique communément acceptée consiste à se référer à un AR en stockant son ID, et non une référence complète.
  • Des approches plus modernes de la conception des agrégats (voir le Livre rouge ) préconisent une séparation plus nette entre les agrégats. Une transaction commerciale ne doit modifier l'état que d'un seul agrégat. Dans cette hypothèse, la nécessité de stocker une référence à un autre agrégat a tendance à disparaître car vous n'allez pas modifier 2 agrégats en même temps.

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 séparé?

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

guillaume31
la source
Merci Guillaume pour la réponse claire, concise et perspicace. Le vrai savoir-faire des connaisseurs DDD. C'est ce que je cherchais. Chapeau!
Lesair Valmont
Je sais que cela peut être une question idiote, mais pourrais-je demander quelle est la signification de holding a referencedans ce contexte? parce que je me suis trompé quand vous avez dit cela: holding a reference to a root is legitensuite 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.
Anyname Donotcare
1
Tenir une référence = la garder en interne / durablement, en tant que membre de la classe. La dichotomie est ici racine vs non racine. Vous pouvez conserver une référence racine mais pas une référence non racine.
guillaume31
@ guillaume31 merci beaucoup, mais pourrais-je demander si est-il correct de conserver une identité interne (non-root) dans un autre agrégat ou cela viole si (root ou non)?
Anyname Donotcare
Que feriez-vous avec cette pièce d'identité? Même les référentiels ne vous donnent que des racines, pas des entités internes.
guillaume31
1

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

Ewan
la source
Ewan, je pensais plus à réutiliser une classe entre deux agrégations différentes dans le sens de la POO, plutôt qu'à avoir un service de domaine agissant comme un script métier qui travaillerait avec les deux agrégats DDD différents. En conclusion, je suis d'accord avec vous, ma racine globale ne devrait avoir que des propriétés qui font partie de son domaine.
Lesair Valmont