【问题标题】:Operations on entities within a aggregate root聚合根中实体的操作
【发布时间】:2012-07-30 17:39:37
【问题描述】:

如果我设计了如下所示的 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);
    }
}

【问题讨论】:

    标签: domain-driven-design aggregateroot


    【解决方案1】:
    Order order = orderRepository.find(orderId);
    order.changeTitle(orderLineId, "New title");
    

    其中 'orderLineId' 可以是行号或索引或其他东西,只要它是聚合根特定的(不是全局 id)。请参阅this 对类似问题的回答。

    【讨论】:

    • 这种方法会不会导致 AR 暴露的界面膨胀?它需要通过自己的接口公开其所有实体的行为。还假设 orderline 有一组需要更新的标签。我们是否会使用类似 order.changeTagTitle(orderLineId,tagId, "New title"); ?
    • @Sudarshan:是的,它会使界面膨胀。但大多数时候聚合相对较小,聚合上不相关方法的数量不会很大。这是 DDD 的缺点之一。
    • 如何设计优雅的 Aggregate Root 接口?因为如果一个 AR 甚至只有 2 个实体,并且每个实体都需要公开 2 个行为,那么每个 AR 将有 4 个行为要公开,而不是它的拥有
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2012-06-18
    相关资源
    最近更新 更多