2010-11-10 9 views
5

He estado trabajando con DDD durante algunos meses y me he encontrado con algunas cosas de las que no estoy seguro.¿Cuál de estos ejemplos representa el uso correcto de DDD?

Tome el ejemplo simplista de agregar un Product a un objeto Order. Desde nuestro controlador, tendríamos un int pasado a través de la interfaz de usuario que representa un Product en la base de datos. ¿Cuál de los siguientes dos ejemplos es correcto (avíseme si ambos están equivocados)?

Ejemplo uno:

public class OrderController 
{ 
    // Injected Repositories 
    private readonly IProductRepository _productRepository; 

    // Called by UI 
    public void AddProduct(int productId) 
    { 
     Order order = ...; // Persisted Order 
     Product product = _productRepository.GetProduct(productId); 
     order.AddProduct(product); 
    } 
} 

El controlador crea una instancia del producto en sí y lo añade en a través del método:

void AddProduct(Product product) 
{ 
    productList.Add(product); 
} 

Ejemplo dos:

public class OrderController 
{ 
    // Injected Repositories 
    private readonly IProductRepository _productRepository; 

    // Called by UI 
    public void AddProduct(int productId) 
    { 
     Order order = ...; // Persisted Order 
     order.AddProduct(productId, _productRepository); 
    } 
} 

El Order modelo de dominio tiene el repositorio producto inyectado se le pasa y se pone el producto y lo añade:

Product AddProduct(int productId, IProductRepository productRepository) 
{ 
    Product product = productRepository.GetProduct(productId); 
    productList.Add(product); 

    return product; 
} 

He ido actualmente para el primer ejemplo, debido a que su modelo de dominio nunca debe llamar a un método de servicio internamente, sin embargo Recientemente he visto algunos ejemplos que usan mi segundo ejemplo y se ve limpio. Me parece que El ejemplo uno está rayando en Anemic. El ejemplo dos movería toda la lógica de adición de productos al propio modelo de dominio.

+0

Parece que el primer ejemplo llevaría un diseño hacia la carga codiciosa de datos, y el segundo hacia la carga diferida. ¿Cuál de estos prefiere? –

+0

¿Cómo se guarda su pedido después de que el producto se haya agregado a la lista en memoria? ¿Hay algo de magia sucediendo (lo siento, no sé C# tal vez el objeto Order es un proxy administrado por un marco?) –

Respuesta

2

segundo es horrible ...

añadir un producto a la orden no debe tener el repositorio en su firma desde el repositorio no es parte del dominio.

Tiendo a ir con el primero.

+0

Repositorio en realidad ** Interfaces ** son parte del dominio. La implementación concreta es parte de la Infraestructura del dominio: http://dddsample.sourceforge.net/architecture.html – GenericTypeTea

+0

Cuando va al supermercado y recoge un artículo y lo agrega al carro, ¿especifica un repositorio? Se puede pensar que el repositorio forma parte del dominio de la infraestructura, pero no del dominio comercial. – Aliostad

+0

No, estoy demasiado ocupado implementando 'IWheel'. Pero me gusta tu ejemplo :). Pensé que se veía raro; hace que todo esté más ordenado, pero no parece cumplir las reglas tal como las entendí. – GenericTypeTea

1

sí compinche el primero es mejor ...

Como si pensamos en la forma de los objetos ...

Se añade el producto a la lista no tiene nada que ver con el repositorio del producto, lo que debería tomar solo el producto.

+0

producto es en realidad producto, fue un error tipográfico – Genius