2012-07-30 58 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

相關問題