领域驱动设计:聚合根属性是其他聚合根的集合



在我的领域模型中,我有两个主要实体:User事件和,我决定把它们作为集合根。用户和事件是一对多的关系,用户可以创建多个事件。然而,一个事件不一定有一个相应的用户(即由管理员创建),并有自己的一组属性/实体。事件应该能够独立于用户进行操作。

考虑到这些关系,我想知道我是否在我的建模中做错了什么?是否可以让用户聚合根引用另一个聚合根?假设事件可以独立于用户进行操作,这会给用户的一致性带来任何风险吗?

如果一个聚合引用另一个聚合反映了您的业务的域模型,则完全可以。此外,您已经指出需要对独立于用户的事件聚合进行单独的操作(事务)。

当你在代码中实际实现模型时,你应该确保的是在user中不引用完整的事件聚合对象,而是引用。

对于这种情况,自定义值对象,如EventId将对事件聚合的引用强类型化是有意义的。EventId类可能只包含事件聚合的id,但在整个代码中使引用类型显式。

根据您的需要,它们也可以是User的业务逻辑所需的Event的其他感兴趣的数据。在这种情况下,你也可以考虑创建一个包含该信息的自定义值对象,例如UserEvent,其中包含EventId以及您需要的其他信息。你当然知道最合适的名字……这也使得用户聚合真正依赖的事件数据非常明确,以保持其业务逻辑不变。

在Vaughn Vernon的《实现领域驱动设计》一书中,他举例说明了一个类似的集群,在敏捷项目管理领域中,ProductBacklogItem是单独的聚合,而Product引用了几个相关的待办事项作为ProductBacklogItem对象的集合。见https://github.com/VaughnVernon/IDDD_Samples/blob/master/iddd_agilepm/src/main/java/com/saasovation/agilepm/domain/model/product/Product.java

注意:在这种情况下,他选择Productbacklogitem作为一个实体,这是为了使Hibernate更容易持久化集合,在这种情况下使用,但是如果有另一种持久化机制,可以很容易地将对象集合存储在同一个表中,或者甚至有一个键值存储,将改变使用值对象的决定。

最新更新