9

Estoy tratando de usar el patrón Repositorio para mi proyecto actual y actualmente estoy en el proceso de tratar de modelar el dominio y encontrar las raíces agregadas.Raíces agregadas. ¿Qué tan lejos está el agujero del conejo?

He leído la regla 'Borrar en cascada' que establece que si no tiene sentido eliminar un miembro cuando se elimina la raíz, entonces no debe ser parte de la raíz.

voy a utilizar un incidente de Policía como un eample: -

Incidente (raíz agregada) - Esto podría contener agentes investigadores, notas realizadas por cada agente. También podría contener sospechosos con una lista de fechas que fueron entrevistadas. ¿Se obtuvieron imágenes de CCTV para el incidente? Un registro de cada vez que el CCTV fue visto y por quién? Se hicieron copias del CCTV para pruebas/corte, etc.

Parece que el IncidentAggregate podría volverse enorme, ya que parece que todo depende de ese incidente.

Mi pregunta es doble, ¿cuánto debe administrar la raíz de agregado y, son raíces dentro de las raíces una buena idea?

Esto puede no ser un buen ejemplo, ya que probablemente nunca eliminaría algo así como un incidente policial, pero espero que describa mejor mi pregunta.

Respuesta

10

Un agregado generalmente contiene referencias a otras raíces agregadas. Estas referencias se deben eliminar cuando se elimina el agregado que contiene, pero los agregados a los que apuntan se mantendrán.

Para usar su analogía. Un informe que asumiremos es parte de un único agregado de incidentes y se eliminará junto con el agregado. Ningún otro agregado tendría acceso directo a estos informes.

Sin embargo, el agregado de incidentes sería referencia agregados que representan oficiales, y sospechosos, y entradas de registros de visualización de CCTV.

9

Un agregado es un grupo de objetos con el mismo ciclo de vida.

Si borraste un incidente, ¿también querrías eliminar al oficial investigador? No, si lo hicieras, pronto no tendrías más policías. El oficial investigador no está en el agregado del incidente.

De las otras cosas que enumera, sospechosos, entrevistas, CCTV, etc. La respuesta es - depende.

Depende del dominio de su problema. ¿Qué está haciendo tu sistema? ¿Cuál es su alcance? ¿Qué problema está resolviendo?

Si lo único que se necesita es rastrear una serie de incidentes y asumir que las entrevistas y los CCTV solo están en el sistema como resultado de un solo incidente, entonces sí, tenerlos a todos en un agregado podría ser apropiado. Si se elimina el incidente, los sospechosos, las entrevistas y CCTV pueden ir.

Si, por ejemplo, también rastrea archivos de imágenes de CCTV recopiladas de una red de cámaras del centro de la ciudad. Tal vez estés tratando de controlar su efectividad y confiabilidad. Si es así, debes tratar el video de CCTV de manera diferente. Sería en un agregado diferente con su propio ciclo de vida. Si borra un incidente, aún desea mantener sus secuencias de CCTV para otros incidentes y métricas de rendimiento.

Lo que está dentro y fuera de un agregado depende del dominio de su problema. O más precisamente, depende de la forma en que haya modelado la solución del dominio del problema.

Think lifecycle.

1

"¿Son buenas las raíces dentro de las raíces?"

Respuesta corta en mi opinión es no. Como dice Kurt, debe mantener referencias en otros agregados. Para ser claros, me refiero a identificar objetos por referencia. Así que tal vez el agregado de incidentes tendría una propiedad como

public IEnumerable<Guid> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); } 
} 

O

public IEnumerable<OfficerReference> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); } 
} 

medio de las cuales OfficeReference es una clase que representa el valor de una identidad oficiales (bajo el capó, probablemente sería un GUID).

Si su lógica de dominio necesita realizar acciones utilizando tanto el incidente como los oficiales de investigación, abstraería esta lógica a un servicio de dominio y usaría IOfficerRepository para buscar los agregados de oficiales utilizando los ID provistos en el agregado de incidentes.

Cuestiones relacionadas