在实体 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
/Cart
与 Order
的另一次讨论,但这些概念仍然适用。
另一方面,我现在倾向于将任何仅存在于聚合中的“值对象”定义为聚合中的嵌套 class。我不会有 Order
和 OrderItem
classes 而是 Item
class 在 Order
class... Order.Item
。虽然这是一个设计选择,但我想我会提到它。
我们可以在实体内部使用 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
/Cart
与 Order
的另一次讨论,但这些概念仍然适用。
另一方面,我现在倾向于将任何仅存在于聚合中的“值对象”定义为聚合中的嵌套 class。我不会有 Order
和 OrderItem
classes 而是 Item
class 在 Order
class... Order.Item
。虽然这是一个设计选择,但我想我会提到它。