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.
fuente
Respuestas:
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,
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
fuente
holding a reference
en este contexto? porque confundí cuando dijiste eso:holding a reference to a root is legit
luego 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.
id
entidad interna (no raíz) en otro agregado o esto viola si (raíz o no)?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
fuente