tutorial microservicios implementing example español driven dominio domain development ddd domain-driven-design repository aggregate loading aggregateroot

domain driven design - microservicios - La raíz agregada hace referencia a otras raíces agregadas



implementing domain driven design español (2)

Quizás el repositorio AggregateRoot1 podría llamar al repositorio AggregateRoot2 cuando está construyendo la entidad AggregateRoot1.

No creo que esto invalide ddd ya que los repositorios todavía están a cargo de obtener / crear sus propias entidades.

Actualmente estoy trabajando mucho con DDD, y estoy enfrentando un problema al cargar / operar en raíces agregadas de otras raíces agregadas.

Para cada raíz agregada en mi modelo, también tengo un repositorio. 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 de valor).

AggregateRoot1 y AggregateRoot2.

AggregateRoot1 tiene un miembro de entidad que hace referencia a AggregateRoot2.

  1. Cuando cargo AggregateRoot1, ¿debo cargar AggregateRoot2 también?
  2. ¿Debería el repositorio de AggregateRoot2 ser responsable de esto?
  3. Si es así, ¿está bien que la entidad en AggregateRoot1 llame al repositorio de AggregateRoot2 para cargar?

Además, cuando creo una asociación entre la entidad en AggregateRoot1 a AggregateRoot2, ¿debería hacerse a través de la entidad, o a través del repositorio de AggregateRoot2?

Espero que mi pregunta tenga sentido.

[EDITAR]

SOLUCIÓN ACTUAL

Con la ayuda de Twith2Sugars he encontrado la siguiente solución:

Como se describe en la pregunta, una raíz agregada puede tener hijos que tienen referencias a otras raíces. Al asignar root2 a uno de los miembros de root1, el repositorio para root1 será responsable de detectar este cambio y delegarlo en el repositorio para 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) } }

Este es solo un ejemplo simple, no se incluye la Ley de Demeter u otros mejores principios / prácticas :-)

Otros comentarios apreciados.


Yo mismo he estado en esta situación y llegué a la conclusión de que es un dolor de cabeza demasiado fuerte para que los agregados infantiles funcionen de una manera elegante. En su lugar, consideraría si realmente necesita hacer referencia al segundo agregado como hijo del primero. Hace la vida mucho más fácil si solo mantiene una referencia del ID del agregado en lugar del agregado en sí mismo. Luego, si hay una lógica de dominio que involucra ambos agregados, esto puede extraerse a un servicio de dominio y verse así:

public class DomainService { private readonly IAggregate1Repository _aggregate1Repository; private readonly IAggregate2Repository _aggregate2Repository; public void DoSomething(Guid aggregateID) { Aggregate1 agg1 = _aggregate1Repository.Get(aggregateID); Aggregate2 agg2 = _aggregate2Repository.Get(agg1.Aggregate2ID); agg1.DoSomething(agg2); } }

EDITAR:

Realmente recomiendo estos artículos sobre el tema: https://vaughnvernon.co/?p=838