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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top