2010-12-01 19 views
7

que estoy tratando de conseguir mis manos sucias DDD aprendizaje (mediante el desarrollo de un sitio de comercio electrónico muestra con entidades como Order, OrderLines, Product, Categories etc). Por lo que pude percibir sobre el concepto de agregación de raíz, pensé que la clase Order debería ser una raíz agregada para OrderLine.DDD - Agregada Raíz - Ejemplo Orden y OrderLine

Las cosas fueron bien hasta el momento, sin embargo, estoy confundido cuando define un flujo de orden de crear desde la interfaz de usuario. Cuando quiero añadir una línea para mi objeto orden, ¿cómo debo obtener/crear una instancia de un OrderLine objeto:

  1. ¿Debo codificar la nueva OrderLine() declaración en mi clase de interfaz de usuario/servicio
  2. En caso Defino un método con parámetros como productID, quantity etc. en la clase Order?

Además, ¿qué sucede si quiero eliminar las instancias codificadas de la interfaz de usuario o la clase Order con una DI? ¿Cuál sería el mejor enfoque para esto?

Respuesta

2

Por lo que pude percibir sobre concepto raíz Agregada I pensaron clase Order debe ser una raíz aggreagrte para OrderLine.

Sí, OrderLine's debería estar probablemente en una raíz de pedido, ya que OrderLine probablemente no tenga sentido fuera de una orden principal.

¿Debo codificar la nueva OrderLine() declaración en mi clase de interfaz de usuario/servicio

Probablemente no

, aunque esto es lo que sucede a menudo y que está hecho para trabajar. El problema, como lo veo, es que la construcción de objetos a menudo ocurre en diferentes contextos, y las restricciones de validación difieren dependiendo de ese contexto.

¿Debo definir un método con parámetros como productID, cantidad, etc. en la clase de pedido?

Como en:

public OrderLine AddOrderLine(Product product, int Quantity ...) 

Ésta es una manera de hacerlo. Tenga en cuenta que utilicé una clase de Producto en lugar de un ProductId. A veces uno es preferible al otro. Encuentro que uso ambos mucho por varias razones: a veces tengo la ID y no hay una buena razón para extraer la raíz agregada, a veces necesito la otra raíz para validar la operación.

Otra forma de hacerlo es implementar una colección personalizada para los niños.

por lo que tengo:

order.OrderLines.Add(product, quantity); 

Esto se siente un poco más natural o OO, y en particular si una raíz entidad tiene muchas colecciones hijas Evita el desorden.

order.AddOrderLine(), order.AddXXX(), order.AddYYY(), order.AddZZZ()

frente

order.OrderLines.Add(), order.ZZZs.Add(), order.YYYs.Add()

Además, lo que si quiero eliminar los ejemplificaciones codificados desde la interfaz de usuario o la clase de Orden usando un DI. ¿Qué sería el mejor enfoque para esto?

Esto sería una caja de libros de texto para el patrón de fábrica. Inyecté dicha fábrica en mis colecciones personalizadas para admitir la creación de instancias en esos métodos Add().

+1

No creo que order.OrderLines.Add sea más OO. Hay una cosa OO llamada encapsulación. Si tiene muchos XXX, ZZZ, YYY en su clase, es mejor rediseñarlo (un buen diseño de OO tiende a tener muchos objetos pequeños). Puede buscar en Google los beneficios de encapsular colecciones y evitar accidentes de trenes (las interfaces fluidas son el otro caso). –

2

Puede utilizar un OrderLine Factory para obtener instancias de Orderlines. Usted "actualizará" un objeto OrderLine en la fábrica con los parámetros pasados ​​al método de fábrica y luego devolverá la nueva instancia a su objeto Order. Siempre trate de aislar instancias y no lo haga en la interfaz de usuario. Hay una pregunta here que usa esta técnica.

Aquí hay un gran libro que puede ser útil en DDD.

Cuestiones relacionadas