Para agregar ou não - pedido/linha de pedido
-
13-11-2019 - |
Pergunta
Sobre Domain Driven Design, Order e OrderLines são sempre vistos como um agregado, onde Order é a raiz.Normalmente, uma vez criada uma encomenda, não é possível alterá-la.No meu caso, porém, isso é possível.Em vez disso, cada pedido possui um estado que determina se o pedido pode ser alterado ou não.
Nesse caso, Order e OrderLines são sua própria “raiz agregada”?Preciso atualizar as linhas de pedido, então acho que elas deveriam ter seu próprio repositório.Mas não quero recuperar linhas de pedido e persisti-las sem o pedido.Portanto, isso indica que ainda há um agregado onde Order é a raiz com um método de fábrica para criar linhas de pedido (Order.CreateOrderLine(quantity, text,…).
Outra abordagem poderia ser atualizar o Pedido quando a coleção de linhas do pedido for modificada e, em seguida, chamar UpdateOrder(Order).Eu precisaria de alguma forma de detectar que apenas a coleção deveria ser atualizada, e não o próprio pedido (usando o Entity Framework).O que você acha?
Solução
As linhas de pedido não devem ser um agregado próprio e não precisam de seu próprio repositório.Seu agregado deve ser configurado mais ou menos assim ...
public class Order
{
private List<OrderLine> _orderLines;
private OrderState _orderState;
public IEnumerable<OrderLine> OrderLines
{
get { return _orderLines.AsReadOnly();}
}
public OrderState Status
{
get { return _orderState; }
}
public void DeleteOrderLine(Guid orderLineID)
{
if (Status.IsProcessed)
throw new InvalidOperationException("You cannot delete items from a processed order");
OrderLine lineToRemove = _orderLines.Find(ol => ol.Id == orderLineID);
_orderLines.Remove(lineToRemove);
}
public void AddOrderLine(Product product, int quantity)
{
if (Status.IsProcessed)
throw new InvalidOperationException("You cannot add items to a processed order");
OrderLine line = new OrderLine(product.ProductID, (product.Price * quantity), quantity);
_orderLines.Add(line);
}
}
A estrutura de entidades possui alguns recursos integrados para detectar alterações em seu objeto.Isso é explicado aqui (convenientemente com um exemplo de pedido/linhas de pedido): http://msdn.microsoft.com/en-us/library/dd456854.aspx