2010-02-05 16 views
14

Estoy empezando en DDD, y estoy teniendo algunos problemas para encontrar la manera de adaptar la naturaleza relacional de mis datos. Tengo lo que creo que se consideraría mi raíz agregada, pero el agregado también tiene un agregado propio. No queriendo violar la Ley de Demeter, me pregunto si estoy pensando en esto mal y espero que algún experto en DDD pueda ofrecer alguna información.Tratando con agregados anidados en DDD

Mi raíz de agregado es mi objeto Account, que tiene un agregado de numerosas entidades AccountElement, que a su vez son agrupaciones lógicas de entidades individuales ProductComponent.

Un AccountElement fuera del contexto de un Account no tiene sentido, así que estoy a gusto con mi conclusión de que el objeto Account es mi raíz agregada, y anticipo que entidad que tenga un agregado Elements propiedad. Es la colección ProductComponent que me tiene confundido. Este agregado no tiene significado fuera de AccountElement, y realmente no tiene significado fuera de Account.

No creo que debería estar accediendo ProductComponent objetos individuales que salpican el camino a ella, como:

var reference = account.Elements(0).ProductComponents(0).ReferenceCode; 

Pero, al mismo tiempo que no tiene sentido (desde una perspectiva de dominio) a acceda a ProductComponent directamente desde una entidad Account.

Estoy seguro de que todo esto es un poco difícil de comprender sin conocimiento de mi dominio, pero espero que sea suficiente para obtener buenos comentarios.

+3

Si necesita este nivel de objetos de anidación para que su modelo de objetos funcione, entonces no me preocuparía demasiado por la Ley de Demeter. Consulte http://haacked.com/archive/2009/07/14/law-of-demeter-dot-counting.aspx –

+0

Vea también http://www.dcmanges.com/blog/37 –

+1

Gracias, el artículo de Phil fue útil, y la pregunta de qué tan inextricablemente relacionados están los hijos de los niños con la raíz agregada es realmente clave aquí. Al ver eso, tiene sentido anidar las entidades. Estoy más cómodo, esto es correcto porque después de tomar esta decisión, la dirección del código parece ser mucho más intuitiva. O en el espíritu de DDD, sería mejor decir que es una abstracción más verdadera del lenguaje omnipresente;) –

Respuesta

1

El artículo relacionado con Robert es bueno. Añadiría que si ProductComponent existe solo en el contexto de AccountElement y AccountElement solo existe en el contexto de Account, entonces por extensión ProductComponent está en el contexto de Account.