¿Qué es un agregado?
Un agregado es un objeto de dominio que depende de otro objeto de dominio raíz. Tiene significado propio, pero forma parte de una unidad conceptual mayor dentro del sistema. No debe confundirse con una colección, ya que una colección es solo un listado de valores, mientras que un agregado representa una pieza del dominio con comportamiento y restricciones.
De la misma forma que un objeto de dominio no es un reflejo directo de la base de datos, los agregados tampoco lo son. Pueden reflejar información persistida, pero no son simples estructuras de datos ni primitivos sin contexto.
¿Qué nos permiten?
El uso de agregados ayuda a limitar el número de interacciones directas entre modelos. El objeto raíz no necesita conocer los detalles de implementación de sus agregados, sino delegar en ellos las acciones que les corresponden dentro del dominio.
Esto favorece la aplicación de la Ley de Deméter, reduce el acoplamiento y evita efectos colaterales cuando la implementación cambia con el tiempo.
¿Cómo persistirlo?
Por definición, solo los objetos raíz deberían tener un Repository. Todas las operaciones de persistencia del objeto raíz deberían pasar por ese repositorio, y será este el encargado de gestionar también la persistencia de sus agregados.
Ahora bien, cuando un raíz se relaciona con otro raíz ya no hablamos de un agregado en sentido estricto, sino de dos raíces independientes, cada una con su propio Repository.
Aquí entra en juego el concepto de Domain Service. Este servicio recibe mediante inyección de dependencias los repositories necesarios para recuperar las raíces implicadas, realizar las operaciones oportunas y persistir después los cambios.
El objeto raíz que referencia al otro no debería almacenar el agregado completo, sino únicamente una lista de identificadores.
Conclusión
El patrón agregado permite componer objetos de dominio bajo una raíz, reduciendo acoplamiento y delegando responsabilidades. A la hora de persistirlo, debemos distinguir entre dos casos:
- Si se trata de otro objeto raíz, lo apropiado es trabajar con identificadores y coordinar la operación mediante un Domain Service.
- Si se trata de un objeto de dominio interno al agregado, debe persistirse a través del Repository del objeto raíz.