在实体 DDD 中使用 List<ValueObject>

using List<ValueObject> inside an entity DDD

我们可以在实体内部使用 List<ValueObject> 吗?或者我们应该将它们用作 List<entity>?

当我在我的“Product”实体 class 中使用“List<Discount>”时,entity framework 创建一个 'Discount' table生成的列 ID。

我可以将折扣定义为值对象列表吗? 当值对象用作列表时,是否将其用作具有标识的实体更好?

第二个问题是关于更新实体内部的“List<Discont>”。如何在其实体内更新此值对象列表(添加、删除折扣)? 谢谢

正如 @Ivan Stoev 在评论中提到的,您的域模型不是您的数据库模型。您需要以面向对象的方式为您的域建模,理想情况下,不考虑数据库。顺便说一句,在 Value Object 中有一些标识符不会使它成为 Entity。但是,Entity 总是需要在该实体集中有一个唯一标识符,但标识符并不是使 class 成为实体的决定性因素(即它是否具有自己的生命周期)。

在现实世界中,人们需要务实地对待一般指导。例如,如果您的值对象需要某种标识符,那很好。但是,可能那里已经有可以使用的东西。在 OrderItem 中,可以使用 ProductId,因为每个产品应该只有一个项目。在您的 Discount 场景中,可能有一个 DiscountType 只允许使用唯一折扣类型。就可变值对象而言,值对象通常不可变的原因是它代表一个特定的值。您永远不会更改 10,因为那将是另一个值。似乎有人会在需要 15 时将 10 更改为 15,但实际上,15 另一个 值对象。同样,需要务实,在许多情况下,我们最终使用的 Value Object 不像单个值那样原始,因此更改值对象上的某些内容可能是有意义的。订单商品当然 不是 实体,但需要经常更改商品上的 Quantity。好吧,这可能是围绕 Quote/CartOrder 的另一次讨论,但这些概念仍然适用。

另一方面,我现在倾向于将任何仅存在于聚合中的“值对象”定义为聚合中的嵌套 class。我不会有 OrderOrderItem classes 而是 Item class 在 Order class... Order.Item。虽然这是一个设计选择,但我想我会提到它。