2012-07-30 63 views
3

如果我设计了一个像下面这样的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
Order order = orderRepository.find(orderId); 
order.changeTitle(orderLineId, "New title"); 

其中“orderLineId”可以是一个线数字或索引或其他东西,只要它是聚合根特定的(不是全局ID)。请参阅this对类似问题的回答。

+0

这种方法会不会导致AR暴露的接口膨胀?它需要通过自己的接口来暴露所有实体的行为。另外假设该订单行有一组需要更新的标签。我们会像order.changeTagTitle(orderLineId,tagId,“New title”); ? – Sudarshan 2012-07-31 02:10:33

+0

@Sudarshan:是的,它会膨胀界面。但大多数情况下,总量相对较小,并且总量上不相关的方法数量不会很大。这是DDD的一个缺点。 – Jeroen 2012-07-31 09:58:59

+0

如何设计优雅的聚合根接口?因为如果一个AR甚至只有2个实体,并且每个实体都需要暴露2个行为,则每个AR将有4个行为来暴露,而不是它自己的行为 – Sudarshan 2012-08-15 14:12:53

相关问题