Агрегировать или нет - заказ / строка заказа - PullRequest
1 голос
/ 13 февраля 2011

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

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

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

1 Ответ

2 голосов
/ 14 февраля 2011

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

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

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

...