1

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

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

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

4

1 回答 1

2

订单行不应该是它自己的集合,也不需要它自己的存储库。你的聚合应该是这样设置的......

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

于 2011-02-14T10:30:03.537 回答