¿Qué es una raíz agregada?

447

Estoy tratando de entender cómo usar correctamente el patrón de repositorio. El concepto central de una raíz agregada sigue surgiendo. Cuando busco ayuda tanto en la web como en Stack Overflow para saber qué es una raíz agregada, sigo encontrando discusiones sobre ellos y enlaces muertos a páginas que se supone que contienen definiciones básicas.

En el contexto del patrón de repositorio, ¿qué es una raíz agregada?

Dinah
fuente
16
Considere revisar los siguientes estudios de caso. Diseño efectivo de agregados Parte I: Modelar un agregado único dddcommunity.org/wp-content/uploads/files/pdf_articles/… Parte II: Hacer que los agregados trabajen juntos dddcommunity.org/wp-content/uploads/files/pdf_articles/… Parte III: Obteniendo información a través del descubrimiento dddcommunity.org/wp-content/uploads/files/pdf_articles/…
Ben Vitale

Respuestas:

310

En el contexto del patrón de repositorio, las raíces agregadas son los únicos objetos que su código de cliente carga desde el repositorio.

El repositorio encapsula el acceso a los objetos secundarios: desde la perspectiva de la persona que llama, los carga automáticamente, ya sea al mismo tiempo que se carga la raíz o cuando realmente se necesitan (como con la carga diferida).

Por ejemplo, puede tener un Orderobjeto que encapsula operaciones en varios LineItemobjetos. Su código de cliente nunca cargaría los LineItemobjetos directamente, solo el Orderque los contiene, que sería la raíz agregada para esa parte de su dominio.

Jeff Sternal
fuente
21
Hipotéticamente, si el código del cliente necesitara el LineItem para algún otro propósito, ¿formaría un agregado separado (suponiendo que hubiera otros objetos involucrados no relacionados con el objeto Order)?
Ahmad
20
@ Ahmad, otros agregados pueden referirse a LineItems como datos de solo lectura, simplemente no pueden cambiarlos . Si otros agregados pudieran cambiarlos, no podría proteger los invariantes de la orden (ni las líneas de pedido).
Jeff Sternal
44
Eche un vistazo a esto, por ejemplo, lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… . En el ejemplo, el Cliente es una invariante del Pedido, ¿verdad? Sin embargo, ¿el cliente también puede ser la otra raíz agregada? ¿O me estoy perdiendo alguna comprensión fundamental aquí?
Ahmad
3
@Jeff Dijiste "simplemente no pueden cambiarlos", ¿es exigible o es una convención?
Neil Barnwell
44
@Neil: Lo impondría utilizando cualquier mecanismo de lenguaje disponible, por ejemplo, creando una clase inmutable para representar los datos.
Jeff Sternal
206

De Evans DDD:

Un AGREGADO es un grupo de objetos asociados que tratamos como una unidad con el propósito de cambios de datos. Cada AGREGADO tiene una raíz y un límite. El límite define lo que está dentro del AGREGADO. La raíz es una ENTIDAD única y específica contenida en el AGREGADO.

Y:

La raíz es el único miembro de AGGREGATE que permite que los objetos externos contengan referencias a [.]

Esto significa que las raíces agregadas son los únicos objetos que se pueden cargar desde un repositorio.

Un ejemplo es un modelo que contiene una Customerentidad y una Addressentidad. Nunca accederíamos a una Addressentidad directamente desde el modelo, ya que no tiene sentido sin el contexto de un asociado Customer. Entonces podríamos decir queCustomer y Addressjuntos formar un agregado y esa Customeres una raíz agregada.

jason
fuente
57
Actualización de Eric Evans : enfatice que las raíces agregadas son límites de consistencia para transacciones / concurrencia y enfatice que las entidades externas no pueden contener referencias a otras entidades secundarias agregadas.
Brian Low
3
Así que la palabrería me está confundiendo para siempre. Each AGGREGATE has a rooty The root is the only *member* of the AGGREGATE- este verbage implica que la raíz es propiedad del Agregado. Pero en todos los ejemplos, es al revés: la raíz contiene propiedades que son agregados. ¿Puedes aclarar?
Sinaesthetic
1
Solo para entender bien mi idioma, ¿se Customerconsidera la clase la raíz agregada o las Customer instancias ?
Joe
1
En términos generales, en el paradigma de la línea de pedido del cliente, el Cliente sería la Raíz Agregada. La instancia de un cliente sería una instancia de esa raíz agregada. Cuando habla de una raíz agregada llamada Cliente, está discutiendo la construcción lógica de un Cliente que constituye la instancia de un cliente. Una colección de clientes es solo una colección.
Ibrahim Malluf
111

La raíz agregada es un nombre complejo para una idea simple.


Idea general

El diagrama de clase bien diseñado encapsula sus componentes internos. Se llama el punto a través del cual accede a esta estructura aggregate root.

ingrese la descripción de la imagen aquí

Las partes internas de su solución pueden ser muy complicadas, pero el usuario de esta jerarquía solo lo usará root.doSomethingWhichHasBusinessMeaning().


Ejemplo

Comprueba esta jerarquía de clases simple ingrese la descripción de la imagen aquí

¿Cómo quieres viajar en tu auto? Elegí mejor api

Opción A (de alguna manera funciona):

car.ride();

Opción B (el usuario tiene acceso a las clases internas):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

Si crees que la opción A es mejor, felicidades. Tienes la razón principal detrás aggregate root.


La raíz agregada encapsula múltiples clases. puedes manipular toda la jerarquía solo a través del objeto principal.

Marcin Szymczak
fuente
17
Me gusta el ejemplo, pero estoy luchando por encontrar un escenario en el que el Cliente debería hacer referencia a Engine. Parece que el motor debería estar encapsulado detrás del automóvil. ¿Puedes dar más detalles sobre esto?
emragins
En mi opinión, el motor en sí debe estar dentro de un modelo específico de automóvil, por ejemplo, un BMW serie 5 con motor de 3000cc. Con este modelado, el motor es un componente para un automóvil.
Parama Dharmika
1
@ParamaDharmika seguro, puedes modelarlo de esa manera. Eso depende de cuán 'avanzados' con los autos sean sus clientes. En el modelo básico, debe tener acceso a carla raíz agregada. También puede permitir situaciones como una en el dibujo. La solución correcta depende del modelo de negocio de la aplicación. Puede ser diferente en cada caso.
Marcin Szymczak
1
@MarcinSzymczak correcto, no podría estar más de acuerdo en que la solución depende del modelo de dominio en sí mismo
Parama Dharmika
En realidad, la rueda es un agregado que contiene neumáticos (y otras partes). Si sus reglas requieren que solo se pueda acceder al agregado de la Rueda a través del Agregado de la raíz del automóvil, entonces el motor también está contenido dentro del Agregado de la raíz del automóvil y no se debe acceder fuera del Automóvil. Eso está en el ámbito de una instancia de automóvil. El propietario de un automóvil (Cliente) no haría referencia a un motor, excepto en el contexto de su automóvil.
Ibrahim Malluf
35

Imagine que tiene una entidad de computadora, esta entidad tampoco puede vivir sin su entidad de software y su entidad de hardware. Estos forman el Computeragregado, el mini ecosistema para la porción de Computadora del dominio.

La raíz agregada es la entidad de la nave nodriza dentro del agregado (en nuestro caso Computer), es una práctica común que su repositorio solo trabaje con las entidades que son raíces agregadas, y esta entidad es responsable de inicializar las otras entidades.

Considere la raíz agregada como un punto de entrada a un agregado.

En el código C #:

public class Computer : IEntity, IAggregateRoot
{
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }
}

public class Hardware : IEntity { }
public class Software : IValueObject { }

public class Repository<T> : IRepository<T> where T : IAggregateRoot {}

Tenga en cuenta que el hardware probablemente también sea un ValueObject (no tiene identidad propia), considérelo solo como un ejemplo.

Francisco Aquino
fuente
66
where T : IAggregateRoot- Este me alegró el día
Cristian E.
La redacción es un poco contradictoria, creo, y esto es lo que me confunde cuando intento aprender esto. Estás diciendo que la computadora es el agregado, pero luego estás diciendo que la raíz sería la entidad de nave nodriza DENTRO del agregado. Entonces, ¿cuál es la entidad "nave nodriza" dentro del agregado en este ejemplo?
Sinaesthetic
¡Saludos desde el futuro! Lo que el chico quiere decir es que la computadora en sí misma es la raíz agregada, mientras que la computadora y todo lo que contiene es la agregada. O más claramente: el caso en sí mismo es la raíz agregada, mientras que toda la computadora es el agregado (la colección de todo lo que constituye la "computadora, por ejemplo, iluminación RGB, hardware, fuente de alimentación, sistema operativo, etc.)
Capitán Kenpachi
La técnica IAggregateRoot aparece en la documentación de Microsoft: docs.microsoft.com/en-us/dotnet/architecture/microservices/…
Samuel Danielson
16

Si sigue un enfoque de base de datos primero, la raíz agregada suele ser la tabla en el lado 1 de una relación de 1-muchos.

El ejemplo más común es una persona. Cada persona tiene muchas direcciones, uno o más recibos de pago, facturas, entradas de CRM, etc. No siempre es el caso, pero 9/10 veces lo es.

Actualmente estamos trabajando en una plataforma de comercio electrónico, y básicamente tenemos dos raíces agregadas:

  1. Clientes
  2. Vendedores

Los clientes suministran información de contacto, les asignamos transacciones, las transacciones obtienen líneas de pedido, etc.

Los vendedores venden productos, tienen personas de contacto, páginas sobre nosotros, ofertas especiales, etc.

Estos son atendidos por el repositorio del Cliente y del Vendedor respectivamente.

Capitán Kenpachi
fuente
8
Si sigue un enfoque basado primero en la base de datos, entonces no está practicando el diseño dirigido por el dominio, está siguiendo el diseño dirigido por datos.
Sinaesthetic
55
Es un foro de preguntas y respuestas donde la gente viene a resolver problemas y / o aprender. Ese no era yo el que te estaba molestando. Por definición, DDD es una mentalidad más que cualquier otra cosa y es confuso para muchos, así que me aseguré de que se hiciera el comentario para aquellos que están aprendiendo DDD en un esfuerzo por ayudar a mitigar cualquier combinación potencial de metodologías de diseño.
Sinaesthetic
12

Dina:

En el contexto de un repositorio, la raíz agregada es una entidad sin entidad principal. Contiene cero, una o muchas entidades secundarias cuya existencia depende del padre para su identidad. Esa es una relación de uno a muchos en un repositorio. Esas entidades infantiles son simples agregados.

ingrese la descripción de la imagen aquí

Ibrahim Malluf
fuente
1
Entonces, si usted es un vendedor de automóviles, ¿el automóvil sería una raíz agregada por derecho propio? Porque puedes tener muchos autos que aún no tienen un cliente
JorgeeFG
2
@JorgeeFG la verdadera respuesta es que nadie tiene ningún tipo de pista. Hay tanta información conflictiva diseminada.
Mardoxx
3
Las entidades secundarias no son agregados, solo son entidades que resultan ser miembros del agregado en el que controla la raíz agregada. Un "agregado" es una agrupación lógica de entidades.
Sinaesthetic
@JorgeeFG realmente depende del contexto limitado que esté diseñando. Si usted es un vendedor de automóviles, entonces algo así como un Carshop se convierte en la raíz agregada, y debajo sigue a los Autos ...
jokab
8

Desde un enlace roto :

Dentro de un Agregado hay una Raíz Agregada. La raíz agregada es la entidad principal para todas las demás entidades y objetos de valor dentro del agregado.

Un repositorio opera sobre una raíz agregada.

Más información también se puede encontrar aquí .

Otávio Décio
fuente
44
Gracias. Ese es definitivamente el eslabón roto más común y frustrante que continuamente encuentro.
Dinah
Además, la redacción parece al revés. ¿Cómo puede la raíz estar dentro del agregado y ser su padre al mismo tiempo?
Sinaesthetic
1
La raíz agregada es la clase raíz. Un agregado simple siempre está contenido dentro de una raíz agregada. Usando el diagrama presentado anteriormente ... El cliente es la raíz agregada. El cliente puede tener uno o más autos. Los automóviles son agregados en relación con el cliente. Los autos tienen un motor. El motor es un agregado contenido en el agregado del automóvil. Lo que hace al Cliente una Raíz Agregada es la suposición del modelo de que el acceso a un automóvil o sus componentes siempre se realiza a través del cliente que posee el automóvil.
Ibrahim Malluf
8

Agregado significa colección de algo.
La raíz es como el nodo superior del árbol, desde donde podemos acceder a todo, como el <html>nodo en el documento de la página web.
Blog Analogy, un usuario puede tener muchas publicaciones y cada publicación puede tener muchos comentarios. así que si buscamos a cualquier usuario, entonces puede actuar como root para acceder a todas las publicaciones relacionadas y comentarios adicionales de esas publicaciones. Se dice que todos estos son de colección o agregados

palash140
fuente
1

Agregado es donde protege sus invariantes y fuerza la consistencia al limitar su acceso a la raíz agregada de pensamiento. No olvide que el agregado debe diseñar sobre las reglas comerciales e invariantes de su proyecto, no la relación de la base de datos. no debe inyectar ningún repositorio y no se permiten consultas.

Alireza Rahmani Khalili
fuente