DDD: ¿es correcto que un agregado raíz contenga una referencia a otro agregado raíz?

16

Al seguir el diseño impulsado por dominio (DDD), ¿es correcto que un agregado raíz contenga una referencia a una entidad interna que resulta ser la entidad raíz en un agregado separado?

Creo que esto no es correcto, principalmente debido a esta regla en el libro azul :

Nada fuera del límite AGREGADO puede contener una referencia a algo dentro, excepto a la ENTIDAD raíz. La ENTIDAD raíz puede entregar referencias a las ENTIDADES internas a otros objetos, pero esos objetos pueden usarlas solo de forma transitoria y es posible que no se aferren a la referencia. La raíz puede entregar una copia de un OBJETO DE VALOR a otro objeto, y no importa lo que le pase, porque es solo un VALOR y ya no tendrá ninguna asociación con AGREGAR.

Si un agregado raíz contiene una referencia a otro agregado raíz, se viola el límite del primero y se corrompe todo el concepto de un agregado, por lo que creo que si parece que un agregado raíz necesita mantener una referencia a otro agregado raíz, entonces necesito para crear una entidad diferente , que probablemente compartirá algunos de los mismos miembros que la otra entidad raíz, pero no tendrá una identidad global, como esta otra regla en el libro establece:

Las ENTIDADES de la raíz tienen identidad global. Las ENTIDADES dentro del límite tienen identidad local, única solo dentro del AGREGADO.

Creo que este sería el camino correcto, pero dado que se siente repetitivo y redundante (cuando se saca del contexto de DDD, con POO pura), estoy pidiendo algunos comentarios.

Lesair Valmont
fuente
¿Qué quiere decir con "entidad interna (que resulta ser la entidad raíz en un agregado separado)"?
Erik Eidt
2
FWIW, Cualquier cosa puede referirse a una entidad raíz agregada ya que estas son las cosas que tienen identidad global; si el referente es en sí mismo una entidad raíz o no es irrelevante.
Erik Eidt
Como dijo Erik. Además, no importa si lo hace referencia con ID o referencia en su modelo. Ambos se convertirán a ID en el nivel de base de datos y tener una referencia le da a ORM la capacidad de cargar de forma diferida la entidad a pedido.
Eufórico

Respuestas:

21

Puede que estés sobreinterpretando el libro. Básicamente dice: cualquier cosa fuera de un Agregado no puede contener una referencia a nada dentro de él, excepto la raíz. Por lo tanto, mantener una referencia a una raíz es legítimo. Mantener una referencia a una raíz no significa que sea parte de su propio agregado y que pueda controlar sus invariantes. Mantiene sus propios invariantes y autonomía.

Sin embargo,

  • Una buena práctica comúnmente aceptada es referirse a un AR almacenando su ID, no una referencia completa.
  • Enfoques más modernos para el diseño agregado (ver el Libro Rojo ) abogan por una separación más limpia entre los agregados. Una transacción comercial solo debe cambiar el estado de un Agregado único. Bajo este supuesto, la necesidad de almacenar una referencia a otro Agregado tiende a desaparecer porque no va a modificar 2 agregados al mismo tiempo.

¿Es correcto que un agregado raíz contenga una referencia a una entidad interna que resulta ser la entidad raíz en un agregado separado?

Esto nunca pasa. Un objeto de valor puede ser parte de múltiples agregados, pero no una entidad. La razón es que nada le impedirá compartir la misma instancia de entidad entre los agregados. Digamos que la instancia de entidad E pertenece a las instancias agregadas A y B. Dado que la premisa de DDD es que el Agregado es el punto de entrada, usted podría cargar A, modificar la entidad E a través de él, todo el tiempo violando silenciosamente invariantes de B (que no cargó).

Vea la respuesta de Greg Young aquí: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html

guillaume31
fuente
Gracias Guillaume por la respuesta clara, concisa y perspicaz. Savoir-faire del verdadero conocedor DDD. Esto es lo que estaba buscando. Chapeau!
Lesair Valmont
Sé que puede ser una pregunta tonta, pero ¿podría preguntar cuál es el significado holding a referenceen este contexto? porque confundí cuando dijiste eso: holding a reference to a root is legitluego dijiste: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 el
1
Mantenga una referencia = manténgala interna / duraderamente, como miembro de la clase. La dicotomía aquí es raíz versus no raíz. Puede conservar una referencia raíz pero no una referencia no raíz.
guillaume31
@ guillaume31 muchas gracias, pero ¿podría preguntar si está bien mantener una identidad interna (no raíz) en otro agregado o esto viola si (raíz o no)?
Anyname Donotcare el
¿Qué harías con esa identificación? Incluso los repositorios solo te dan raíces, no entidades internas.
guillaume31
1

Su objeto raíz agregado (generalmente) solo debe tener propiedades que formen parte de su dominio.

Si tiene un objeto AR con una propiedad que no está en el agregado, entonces se enfrenta inmediatamente a la pregunta. '¿Por qué no?'

¿Podría agregar el Id del otro objeto tal vez? ¿O inyectar un repositorio?

Pero parece que debería agregar un servicio de dominio cruzado que haga referencia a ambos objetos raíz y realice la lógica requerida

Ewan
fuente
Ewan, estaba pensando más en reutilizar una clase entre dos agregaciones diferentes en el sentido de OOP, en lugar de tener un servicio de dominio que actúe como un script de negocios que trabajará con los dos agregados DDD diferentes. En conclusión, estoy de acuerdo con usted, mi raíz agregada solo debe tener propiedades que formen parte de su dominio.
Lesair Valmont