Actualmente estoy trabajando mucho con DDD, y tengo un problema al cargar/operar en las raíces de agregación de otras raíces agregadas.Agregado Raíz hace referencia a otras raíces agregadas
Foreach Raíz agregada en mi modelo, también tengo un repositorio. Ahora el repositorio es responsable de manejar las operaciones de persistencia para la raíz.
Digamos que tengo dos raíces agregadas, con algunos miembros (entidades y objetos Value).
AggregateRoot1 y AggregateRoot2
AggregateRoot1 tiene un elemento de entidad que hace referencia a AggregateRoot2
- Cuando cargo AggregateRoot1, debería cargar aggregateRoot2 así?
- ¿Es el repositorio de aggregateRoot2 quién debería ser responsable de esto?
- Es así, ¿está bien que la entidad en aggregateRoot1 llame al repositorio de aggregateRoot2 para cargar?
También, cuando se crea una asociación entre la entidad en AggregateRoot1 a la AggregateRoot2, debería que hacerse a través de la entidad, o a través del repositorio para aggregateRoot2.
Espero que mi pregunta tenga sentido.
[EDIT]
solución actual
Con la ayuda de Twith2Sugars Yo he llegado con la siguiente solución:
Como se describe en la pregunta, una' raíz agregado puede tener hijos que tengan referencias a otras raíces. Al asignar root2 a uno de los miembros de root1, el repositorio de root1 será responsable de detectar este cambio y de delegar esto al repositorio de root2.
public void SomeMethod()
{
AggregateRoot1 root1 = AggregateRoot1Repository.GetById("someIdentification");
root1.EntityMember1.AggregateRoot2 = new AggregateRoot2();
AggregateRoot1Repository.Update(root1);
}
public class AggregateRoot1Repository
{
public static void Update(AggregateRoot1 root1)
{
//Implement some mechanism to detect changes to referenced roots
AggregateRoot2Repository.HandleReference(root1.EntityMember1, root1.EntityMember1.AggregateRoot2)
}
}
Esto es sólo un ejemplo sencillo, sin Ley de Demeter u otros mejores principios/prácticas incluidas :-)
Otros comentarios apreciados
Personalmente puedo ver que este enfoque actual se está volviendo complicado y creo que la solución de DavidMasters84 es más una solución elegante. Es decir, mantener las referencias como id y extraer este tipo de lógica de dominio a un servicio de dominio. –
Messy es un buen adjetivo para este enfoque. Se me permite decir que debido a que originalmente traté de implementar este problema de la misma manera, y un desastre es en lo que me encontré :) es posible que desee leer las sugerencias aquí también para una pregunta similar: http://stackoverflow.com/questions/2118088/aggregate-roots-how-far-do-the-rabbit-hole-go/4936021 # 4936021 –
Te escucho, pero no hay repositorios allí para gestionar las raíces agregadas, y con buena voluntad, las relaciones entre raíces. ¿Y los Servicios de dominio para manejar comportamientos que no encajan naturalmente en una sola entidad? Me parece que hacer que el Servicio de Dominio sea responsable de manejar las referencias entre las raíces es el lugar equivocado al leer la definición de un Servicio de Dominio ... Podría estar equivocado, por lo que se agradecería un argumento respaldado, gracias. – tschmuck