2012-09-25 25 views

Respuesta

9

Viola el diseño impulsado por el dominio, creo que los repositorios no deben hacer referencia entre sí. Además, no debe mapear 1: 1 entre el repositorio y la tabla de la base de datos.

Este es el concepto de Aggregate y AggregateRoot. Ejemplo, suponga la base de datos tiene 2 tablas:

Order 
OrderLine 

Con relación 1: n, (Orden, OrderLine) se define como un agregado porque OrderLine no puede vivir solo sin orden. Y en este caso, Order es la raíz de este agregado.

Con esto, en lugar de crear dos repositorios:

OrderRepository 
OrderLineRepository 

Sólo debe tener un solo OrderRepository para cuidar de todo el agregado, se utiliza la carga en cascada, insertar y eliminar con OrderLine

Así que en En su caso, debe considerar si tiene repositorios de direcciones/ciudades/regiones/países existentes o no.

Esperanza esta ayuda

+2

sí ayuda a excepción de la forma algunas cosas se están haciendo en mi sistema. Tenemos provincias/estados y países normailizados. Entonces, si un usuario o tienda necesita cargar sus datos de dirección y tiene referencias a las tablas que usaría el repositorio de región/país. ¿Está bien cargar diferentes versiones de regiones/países ya que en este contexto las usaré más como objetos de valor que como entidades? –

+1

gracias por esta simple explicación. la bombilla finalmente vino por mí. :) – kman

0

Nos encontramos con el mismo problema con las monedas y países ISO ISO en nuestro sistema. Encontramos que casi cada raíz agregada que teníamos (y tiene un repositorio correspondiente) requería entidades de moneda y/o país como una sub entidad. Este estaba resultando ineficaz desde una perspectiva de gestión de datos y recuperación de datos, así que hizo lo siguiente:

  1. todavía mantienen el concepto de sólo el 1 repositorio por raíz agregada (como la respuesta de Cuong Le arriba)
  2. Mantener un caché de país y los datos de divisas - cuando una raíz agregada está siendo agotado de la base de datos, se utiliza la memoria caché para recuperar la información moneda/país

desde mi experiencia DDD y el libro azul es una valiosa guía, pero usted no tiene que adoptarla 100% exacto, tomas las recomendaciones a bordo pero las adaptas para que tengan sentido para ti.

Espero que esto ayude ...

1

Hay varios enfoques para su problema:

  • Mantener una estrecha relación entre las 2 raíces agregadas e hidratar de manera sistemática toda agregada de la segunda raíz cuando se hidratan la primera raíz Esto requiere que el primer repositorio hable con el segundo, que IMO no rompe ningún principio DDD pero puede ser potencialmente problemático en cuanto al rendimiento.

  • Vincular las 2 raíces juntas sin apretarlas. Esto básicamente significa señalar el ID de la raíz a la que se hace referencia en lugar de la instancia completa. O bien el código del cliente o la raíz misma (aunque algunos dirán que la última es una mala práctica) rehidratará la raíz a la que se hace referencia desde su ID llamando a su repositorio.

  • Tenga en cuenta que los objetos como Ciudad, Región o País son objetos de valor realmente (inmutables), no necesitan una ID y pueden ser referenciados directamente por cualquier raíz o entidad agregada sin consecuencias adicionales. Esto también significa que no hay repositorio para estos objetos.

Elegir entre las opciones 1 y 2 es simplemente una cuestión técnica y solo afectará el rendimiento y la comodidad del desarrollador. La opción 3 es más una opción de dominio con posibles impactos comerciales. ¿Son entidades de dominio grandes de ciudades, regiones y países que el usuario podrá crear, modificar y eliminar? ¿Hay pantallas especiales dedicadas a esos? Estos son temas que debe analizar con su experto de dominio antes de tomar una decisión.

Enlaces que pueden ser útiles:

Aggregate Root references other aggregate roots

http://tech.groups.yahoo.com/group/domaindrivendesign/message/8696

0

también. El propósito de los repositorios en DDD es abstraer la fuente de datos. Si su dirección de usuario necesita una ciudad/región/país para completarse, entonces use esos repositorios.

El problema con este enfoque es que las consultas serán bastante ineficaces.

En su lugar, cree una vista en la base de datos que carga la dirección del usuario con toda la información requerida (o use su ORM si tiene una).

En resumen:

No hay nada en DDD que dicta cómo se debe aplicar sus repositorios. DDD es muy clara en que la entidad cargada desde el repositorio debe ser completa, no importa cómo la información se almacena en la fuente de datos = El repositorio se acaba de definir como una capa de abstracción

Cuestiones relacionadas