Domain driven design 聚合根目录中实体上的操作

Domain driven design 聚合根目录中实体上的操作,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,如果我设计了如下所示的AR,您认为我应该如何着手更新其中一个订单行对象中的属性 例如,我如何更改一个订单行的标题(示例问题) 这是聚合根的顺序 public class Order { private readonly int id; private readonly Customer customer; // Customer is another Aggregate private readonly IList<OrderLine> orderLines;

如果我设计了如下所示的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);
    }
}
公共类秩序
{
私有只读int-id;
私有只读客户;//客户是另一个聚合
私有只读IList订单行;
私有只读IOrderLineFactory orderLineFactory;
公共订单(int id、客户、IOrderLineFactory orderLineFactory)
{
this.id=id;
this.customer=customer;
this.orderLines=新列表();
this.orderLineFactory=orderLineFactory;
}
public void AddOrderLine(项目、整数数量)
{
OrderLine OrderLine=orderLineFactory.Create(此、项目、数量);
订单行。添加(订单行);
}
}

其中“orderLineId”可以是行号、索引或其他内容,只要它是聚合根特定的(而不是全局id)。请参阅类似问题的答案

这种方法不会导致AR暴露的接口膨胀吗?它需要通过自己的接口公开所有实体的行为。还假设orderline有一组需要更新的标记。我们会使用order.changeTagTitle(orderLineId,tagId,“新标题”)@苏达珊:是的,它会使界面膨胀。但大多数情况下,聚合相对较小,聚合上不相关的方法的数量也不会很大。这是DDD的缺点之一。如何设计优雅的聚合根接口?因为如果一个AR只有2个实体,并且每个实体都需要公开2个行为,那么AR将有4个行为要公开,而不是它自己的行为
Order order = orderRepository.find(orderId);
order.changeTitle(orderLineId, "New title");