关于Domain Driven Design,Order和OrderLines始终被视为聚合,其中Order是根。通常,一旦创建订单,就无法更改订单。但就我而言,这是可能的。相反,每个订单都有一个状态,用于确定订单是否可以更改。
在这种情况下,Order和OrderLines都是他们自己的“聚合根”吗?我需要能够更新订单行,所以我认为他们应该拥有自己的存储库。但我不想检索订单行,并在没有订单的情况下坚持订单。因此,这表明仍然存在一个聚合,其中Order是根,其工厂方法用于创建订单行(Order.CreateOrderLine(quantity,text,...)。
另一种方法可能是在修改订单行集合时更新订单,然后调用UpdateOrder(订单)。我需要一些方法来检测只有集合应该更新,而不是订单本身(使用实体框架)。 你觉得怎么样?
答案 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