2009-02-06 14 views
16

Todavía me estoy volviendo loco con DDD, y uno de los obstáculos que he encontrado es cómo manejar asociaciones entre agregados separados. Digamos que tengo un agregado encapsulando Clientes y otros Envíos encapsulados.¿Cómo se manejan las asociaciones entre los agregados en DDD?

Por razones comerciales Los envíos son sus propios agregados, y sin embargo, deben estar vinculados explícitamente a los clientes. ¿Mi entidad de dominio del cliente debe tener una lista de envíos? Si es así, ¿cómo llené esta lista en el nivel del repositorio, dado que tendré un CustomerRepository y un ShipmentRepository (un repositorio por agregado)?

Estoy diciendo 'asociación' en lugar de 'relación' porque quiero enfatizar que esta es una decisión de dominio, no de infraestructura. Primero estoy diseñando el sistema desde el modelo.

Editar: Sé que no necesito modelar las tablas directamente a los objetos; esa es la razón por la que estoy diseñando el modelo primero. En este punto, no me importa en absoluto la base de datos, solo las asociaciones entre estos dos agregados.

+1

ddd ¿no es esa la herramienta gnu http://www.gnu.org/software/ddd/? ¿Desde cuándo ddd representa el diseño impulsado por dominio? – Johan

+0

@ Johan - hace un tiempo, ahora - http://domaindrivendesign.org/ –

+1

@Erik, así las cosas cambian y también lo hacen las versiones cortas de las palabras largas. – Johan

Respuesta

8

No hay razón para que su ShipmentRepository no pueda agregar datos de clientes en sus modelos de envío. Los repositorios no tienen que tener una asignación de 1 a 1 con tablas.

Tengo varios repositorios que combinan varias tablas en un modelo de dominio único.

+0

Entonces, ¿está diciendo que está bien tener acceso a los mismos datos exactos a través de dos raíces agregadas diferentes? –

5

Creo que hay dos niveles de respuesta a esta pregunta. En un nivel, la pregunta es cómo puedo poblar la relación entre el cliente y el envío. Me gusta mucho la semántica de "relleno" donde tu repositorio de envío puede tener un fillOrders (Lista de clientes, ....).

El otro nivel es "cómo manejo los modelos de dominio desnormalizados que forman parte de DDD". Y "Cliente" es probablemente el mejor ejemplo de todos ellos, porque simplemente aparece en muchos contextos diferentes; casi todos sus procesos tienen clientes en ellos y el contexto del cliente suele ser extremadamente variado. Al máximo la mitad del tiempo, estás interesado en los "pedidos". Si mi comprensión del dominio era perfecta al iniciar, me gustaría nunca hacer un concepto de dominio del cliente. Pero no lo es, así que siempre termino haciendo que el cliente se oponga. Todavía recuerdo el proyecto en el que después de 3 años sentí que era capaz de crear el modelo de dominio "Cliente" adecuado. I sería buscando los conceptos alternativos y más detallados que también representen al cliente; PotentialCustomer, OrderingCustomer, CustomerWithOrders y probablemente algunos otros; lo siento, los nombres no son mejores. Necesitaré más tiempo para eso;)

0

El envío tiene una relación de muchos a uno con el cliente. Si está buscando los envíos de un cliente, agregue una consulta a su repositorio de envío que tome un parámetro de cliente.

En general, no creo asociaciones entre entidades cuando las muchas partes no están limitadas.

Cuestiones relacionadas