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

Cha*_*ndu 7 dns domain-driven-design object instantiation

我试图让我的手脏学习DDD(通过开发一个样本电子商务网站与像实体Order,OrderLines,Product,Categories等).从我可以看到的聚合根概念我认为Order类应该是一个聚合根OrderLine.

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

  1. 我应该OrderLine()在我的UI/Service类中对新语句进行 硬编码
  2. 我应该定义与像参数的方法productID,quantity等在Order类的?

此外,如果我想Order使用DI 从UI或类中删除硬编码实例,该怎么办?对此最好的方法是什么?

que*_*rin 4

根据我对聚合根概念的理解,我认为 Order 类应该是 OrderLine 的聚合根。

是的,OrderLine 最有可能位于 Order 根目录下,因为 OrderLine 在父 Order 之外可能没有任何意义。

我应该在 UI/Service 类中硬编码新的 OrderLine() 语句吗

可能不会,尽管这种情况经常发生,而且它就是为了工作而设计的。在我看来,问题在于对象构造通常发生在不同的上下文中,并且验证约束因上下文而异。

我应该在 Order 类中定义一个带有 ProductID、Quantity 等参数的方法吗?

如:

public OrderLine AddOrderLine(Product product, int Quantity ... )
Run Code Online (Sandbox Code Playgroud)

这是一种方法。请注意,我使用了 Product 类而不是 ProductId。有时,其中一种比另一种更可取。我发现由于各种原因我经常使用这两者 - 有时我有 ID,但没有充分的理由拉取聚合根,有时我需要另一个根来验证操作。

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

所以我有:

order.OrderLines.Add(product, quantity);
Run Code Online (Sandbox Code Playgroud)

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

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

相对

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

另外,如果我想使用 DI 从 UI 或 Order 类中删除硬编码实例化,该怎么办?最好的方法是什么?

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

  • 我不认为 order.OrderLines.Add 更 OO。有一种面向对象的东西叫做封装。如果你的类中有很多 XXX、ZZ​​Z、YYY,最好重新设计它(好的 OO 设计往往有很多小对象)。您可以在谷歌上搜索封装集合和避免火车失事的好处(流畅的界面是另一种情况)。 (2认同)