汇总与否 - 订单/订单

时间:2011-02-13 18:20:19

标签: domain-driven-design aggregate aggregateroot

关于Domain Driven Design,Order和OrderLines始终被视为聚合,其中Order是根。通常,一旦创建订单,就无法更改订单。但就我而言,这是可能的。相反,每个订单都有一个状态,用于确定订单是否可以更改。

在这种情况下,Order和OrderLines都是他们自己的“聚合根”吗?我需要能够更新订单行,所以我认为他们应该拥有自己的存储库。但我不想检索订单行,并在没有订单的情况下坚持订单。因此,这表明仍然存在一个聚合,其中Order是根,其工厂方法用于创建订单行(Order.CreateOrderLine(quantity,text,...)。

另一种方法可能是在修改订单行集合时更新订单,然后调用UpdateOrder(订单)。我需要一些方法来检测只有集合应该更新,而不是订单本身(使用实体框架)。 你觉得怎么样?

1 个答案:

答案 0 :(得分: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);
    }
}

实体框架具有一些内置功能,可以检测对象的更改。这在这里解释(方便地使用订单/订单行示例):http://msdn.microsoft.com/en-us/library/dd456854.aspx