Агрегировать или нет - заказ / строка заказа

При проектировании, основанном на домене, Order и OrderLines всегда рассматриваются как совокупность, где Order является корнем. Обычно, когда заказ создан, его нельзя изменить. Однако в моем случае это возможно. Вместо этого каждый заказ имеет состояние, определяющее, можно ли изменить порядок.

В этом случае являются ли и Order, и OrderLines их собственным «совокупным корнем»? Мне нужно иметь возможность обновлять строки заказов, поэтому я полагаю, что у них должен быть собственный репозиторий. Но я не хочу извлекать строки заказа и сохранять их без заказа. Таким образом, это указывает на то, что все еще существует агрегат, в котором Order является корнем с фабричным методом для создания строк заказа (Order.CreateOrderLine (количество, текст,…).

Другой подход может заключаться в обновлении Order при изменении коллекции строк заказов и последующем вызове UpdateOrder (Order). Мне понадобится какой-то способ определить, что должна обновляться только коллекция, а не сам заказ (с использованием Entity Framework). Что вы думаете?


person Vern    schedule 13.02.2011    source источник
comment
Почему бы вам не изменить заказ? Не следует изменять только счет-фактуру.   -  person GolezTrol    schedule 13.02.2011
comment
Есть много случаев, когда вы не хотите менять заказ. Если это было подтверждено покупателем и т. Д. Как бы вы обновили строку заказа, если она является объектом внутри совокупности заказов и не имеет собственного репозитория?   -  person Vern    schedule 13.02.2011


Ответы (1)


Строки заказов не должны быть совокупностью и не нуждаются в собственном репозитории. Ваш агрегат должен быть настроен примерно так ...

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);
    }
}

Entity framework имеет несколько встроенных функций для обнаружения изменений вашего объекта. Это объясняется здесь (удобно на примере строки заказа / заказа): http://msdn.microsoft.com/en-us/library/dd456854.aspx

person David Masters    schedule 14.02.2011