2015-01-03 72 views
1

我有一個父母和孩子班。如果沒有父母,孩子是沒有意義的,我希望孩子能夠參考父母。域模型 - 將孩子添加到父母的正確方法是什麼?

這是一種很好的方式來設置對父級的引用,並將子級添加到父級的集合中?還是有更好的方法來做到這一點?

public class Order 
{ 
    public Guid Id {get; private set;} 
    public Name Id {get; private set;} 
    IEnumberable<Item> Items {get; private set;} 

    public Order(Guid id, string name) 
    { 
      Id = id; 
      name = name; 
      Items = new List<Item>(); 
    } 

    public void AddItem(Item item) 
    { 
      var items = Items.ToList(); 
      items.Add(item); 
      Items = items; 
    } 

} 

public class Item 
{ 
    public Guid Id {get; private set;} 
    public Name Id {get; private set;} 
    public Order Order {get; private set;} 

    public Item(Guid id, string name, Order order) 
    { 
      Id = id; 
      name = name; 
      Order = order; 
      Order.AddItem(this); 
    } 
} 

似乎也許這是一個壞主意,將孩子添加到孩子的父母的集合,但也許是這樣。建立這些關係的最佳方式是什麼?

+0

爲什麼你需要'訂單項'關係?讓應用程序服務調用'order.addItem(new Item(...))'或甚至'order.addItem(itemName)'都是非常好的。我認爲我更喜歡後者,因爲它可以讓客戶不知道哪個具體的類能夠實現。 – plalx

回答

0

你應該問自己:「我爲什麼試圖通過商品找到訂單」。你真的能找到一個好的用例嗎?在這種情況下,Order是聚合根,所以你應該通過Order來操作。在某些情況下,如果您需要查找放置在項目上的所有訂單,則可以在該項目上有訂單集合。在這種情況下,Item也將是一個聚合根。

0

在你的情況下,孩子不應該將自己添加到父集合中。如果您需要對父級引用,則更好的方法是在父級中設置父級,方法是將子級添加到列表中。這意味着在將商品添加到items之後立即設置商品的訂單。

相關問題