【问题标题】:Domain model - What is the proper way for a child to be added to a parent?域模型 - 将孩子添加到父母的正确方法是什么?
【发布时间】:2015-01-03 17:49:39
【问题描述】:

我有一个父类和子类。没有父级,子级就没有意义,我希望子级可以引用其父级。

这是在子级中设置对父级的引用以及将子级添加到父级集合中的好方法吗?或者有更好的方法吗?

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);
     }
}

似乎从孩子内部将孩子添加到父母的集合中可能是一个坏主意,但也许是这样。建立这些关系的最佳方式是什么?

【问题讨论】:

  • 为什么需要Item to Order 关系?让应用程序服务调用order.addItem(new Item(...)) 甚至order.addItem(itemName) 完全没问题。我认为我更喜欢后者,因为它使客户不必知道要实例化哪个具体类。

标签: domain-driven-design parent-child domain-model


【解决方案1】:

您应该问自己“我为什么要尝试通过商品找到订单”。你真的能找到一个好的用例吗?在这种情况下,Order 是聚合根,所以你应该通过 Order 进行操作。在某些情况下,如果您需要查找放置在某个项目上的所有订单,则在该项目上拥有一个订单集合可能是有意义的。在这种情况下,Item 也将是一个聚合根。

【讨论】:

    【解决方案2】:

    在您的情况下,孩子不应将自己添加到父集合中。如果您需要对父级的引用,更好的方法是在父级中设置父级,与将子级添加到列表中的方法相同。这意味着在将项目添加到 items 后立即设置项目的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2015-12-07
      • 2020-07-22
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多