DDD - 聚合根 - 示例订单和OrderLine

时间:2010-12-01 21:27:25

标签: object domain-driven-design dns instantiation

我正在努力学习DDD(通过开发一个包含OrderOrderLinesProductCategories等实体的示例电子商务网站。 根据我对Aggregate Root概念的看法,我认为Order类应该是OrderLine的聚合根。

到目前为止情况还不错,但是当它从UI定义创建订单流时我很困惑。 当我想向订单对象添加订单行时,我应该如何获取/创建OrderLine对象的实例:

  1. 我应该在我的UI /服务类
  2. 中对新的OrderLine()语句进行硬编码
  3. 我应该在productID类中定义一个包含quantityOrder等参数的方法吗?
  4. 此外,如果我想使用DI从UI或Order类中删除硬编码实例,该怎么办?对此最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用OrderLine Factory获取订单行的实例。您将在工厂中“新建”OrderLine对象,并将参数传递给工厂方法,然后将新实例返回到Order对象。始终尝试隔离实例化,而不是在UI中执行此操作。有一个问题here使用了这种技术。

这是一本很有用的书,你会发现DDD

答案 1 :(得分:2)

  

从我能感知到的东西   聚合根概念我以为订单   class应该是一个aggreagrte root   订单行。

是的,OrderLine最有可能属于Order root,因为OrderLine可能在父订单之外没有意义。

  

我应该硬编码新的OrderLine()   我的UI /服务类中的语句

可能不是,虽然这是经常发生的事情并且它可以起作用。我认为问题在于,对象构造经常发生在不同的上下文中,验证约束因内容而异。

  

我应该定义一个方法   参数如productID,数量等   在订单类?

如:

public OrderLine AddOrderLine(Product product, int Quantity ... )

这是一种方法。注意我使用的是Product类而不是ProductId。有时一个比另一个好。我发现由于各种原因我使用了很多 - 有时候我有ID并且没有充分的理由拉动聚合根,有时我需要另一个根来验证操作。

我这样做的另一种方法是为孩子们实现自定义集合。

所以我有:

order.OrderLines.Add(product, quantity);

这感觉更自然或OO,特别是如果实体根有许多子集合,它可以避免混乱。

order.AddOrderLine()order.AddXXX()order.AddYYY()order.AddZZZ()

order.OrderLines.Add()order.ZZZs.Add()order.YYYs.Add()

  

此外,如果我想删除该怎么办?   来自UI的硬编码实例化   或使用DI的Order类。什么   对你来说这是最好的方法吗?

这将是Factory模式的教科书案例。我将这样的Factory注入我的自定义集合中,以支持那些Add()方法中的实例化。