在聚合根内对实体进行操作

4
如果我设计了一个如下所示的AR,你认为我应该如何更新其中一个订单行对象的属性?
例如,我该如何更改其中一个订单行的标题(例如问题)?
这是订单聚合根。
public class Order
{
    private readonly int id;
    private readonly Customer customer; // Customer is another Aggregate
    private readonly IList<OrderLine> orderLines;
    private readonly IOrderLineFactory orderLineFactory;

    public Order(int id, Customer customer, IOrderLineFactory orderLineFactory)
    {
        this.id = id;
        this.customer = customer;
        this.orderLines = new List<OrderLine>();
        this.orderLineFactory = orderLineFactory;
    }

    public void AddOrderLine(Item item, int quantity)
    {
        OrderLine orderLine = orderLineFactory.Create(this, item, quantity);
        orderLines.Add(orderLine);
    }
}
1个回答

1
Order order = orderRepository.find(orderId);
order.changeTitle(orderLineId, "New title");

'orderLineId' 可以是行号、索引或其他任何与聚合根特定相关的内容(而不是全局 ID)。请参见 this 中对类似问题的回答。


这种方法不会导致AR暴露的接口膨胀吗?它需要通过自己的接口公开所有实体的行为。此外,假设orderline有一组标签需要更新。我们是否会采用类似于order.changeTagTitle(orderLineId,tagId,“New title”)的方法? - Sudarshan
@Sudarshan:是的,它会使接口变得臃肿。但大多数情况下,聚合的数量相对较小,而且与聚合无关的方法数量也不会很多。这是DDD的缺点之一。 - Jeroen
如何设计优雅的聚合根接口?因为如果一个聚合根甚至只有两个实体与之相关,并且每个实体都需要暴露两个行为,那么该聚合根除了自身之外还需要暴露四个行为。 - Sudarshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接