Domain driven design 持有实体的值对象

Domain driven design 持有实体的值对象,domain-driven-design,entities,value-objects,Domain Driven Design,Entities,Value Objects,在书中,Eric Evans展示了一个示例,其中值对象包含实体。值对象是不可变的,实体不是 问题是:如果一个实体 从值对象引用是否会更改其状态,不变性是否已被破坏 在我看来,它并没有打破不变性,因为 对象位于实体数组上,而不是其状态 你们怎么想?这取决于你们是否可以通过VO直接变异实体 设想一个可以在多个对象之间共享的VO实例。如果VO包含可变实体并将其公开为公共成员,则多个客户端可以同时更新该实体。这会导致实际不变性中预期不会发生的问题 另一方面,如果VO只持有被引用实体的ID,则在更改它之前

在书中,Eric Evans展示了一个示例,其中值对象包含实体。值对象是不可变的,实体不是

问题是:如果一个实体 从值对象引用是否会更改其状态,不变性是否已被破坏

在我看来,它并没有打破不变性,因为 对象位于实体数组上,而不是其状态


你们怎么想?

这取决于你们是否可以通过VO直接变异实体

设想一个可以在多个对象之间共享的VO实例。如果VO包含可变实体并将其公开为公共成员,则多个客户端可以同时更新该实体。这会导致实际不变性中预期不会发生的问题


另一方面,如果VO只持有被引用实体的ID,则在更改它之前,您必须从存储库中获取一个全新的实例,以避免共享可变状态问题。

这取决于您是否可以直接通过VO对实体进行变异

设想一个可以在多个对象之间共享的VO实例。如果VO包含可变实体并将其公开为公共成员,则多个客户端可以同时更新该实体。这会导致实际不变性中预期不会发生的问题


另一方面,如果VO只持有被引用实体的ID,那么在更改它之前,您必须从存储库中获取一个全新的实例,以避免共享可变状态问题。

如果您想使用不可变值对象(这很好),你可以得到一个新的实体状态对象,然后扔掉一个旧的。我认为这是没有必要的,而且,值对象不知道引用实体中的状态变化,这对我来说是正确的。如果你想处理不可变的值对象(这很好),你可以得到一个新的实体状态对象,然后扔掉一个旧的。我认为这是没有必要的,而且,值对象不知道引用实体中的状态变化,这对我来说是正确的。在我看来,引用实体在任何时候改变它们的状态都无关紧要,正如我之前所说的,对象的值取决于实体数组。但是我通过公开这些实体引用了解到并发性问题。VO完全是关于其属性的值,并且它可能是不可变的,这是两个互补但不同的属性。你特别问的是“打破不变性”,而不是“打破价值”在我看来,引用的实体在任何时候改变它们的状态都无关紧要,正如我前面所说,对象的值取决于实体数组。但是我通过公开这些实体引用了解到并发性问题。VO完全是关于其属性的值,并且它可能是不可变的,这是两个互补但不同的属性。你特别问的是“打破不变性”,而不是“打破价值”