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.
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? –
¿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?) –