我有一个与域驱动设计中聚合之间关系有关的问题。
我有以下情况:我有一个汇总(问卷),其中有一些孩子(问题)。问题是实体,但因为它们在问卷集合内,所以它们可以具有本地身份(即问卷中的id为1的问卷,ID为1234;我可以有另一个问题,id为1,但在另一个问卷中)。因此,要引用一个问题,您必须使用其父母问卷调查ID来确定该问题。
另一方面,我有另一个聚合(收集活动),用于在问卷中存储问题的数据(响应集)(收集活动通过其ID指向问卷,并且响应集再次指向问题它的身份)。我可以有几个收集活动(可能在不同的时间发生),每个收集活动都存储不同的响应集,但是对于相同的问卷(和问题)。
所以我的问题是:我设计得好吗(根据DDD)?或者我是否必须将调查问卷和问题作为单独的聚合来保存,以便从收集活动/响应集中引用它们?
我希望这是有道理的,谢谢你。
答案 0 :(得分:1)
问问自己:应该保护哪些不变量?
在您的情况下,您必须确保在活动期间回答的问题存在(即其索引在问卷中的零和问题数量之间 - 1)并且是允许的问题;其他不变量可能是在至少回答一个问题后不得修改问卷;在任何这些情况下,广告系列都必须与问卷同步。我看到至少有两个解决方案:
最简单的解决方案是将一个大的聚合,Questionare
聚合,以问题,活动和答案作为子实体,这样您就可以保护这些不变量;这有一些性能影响,但只有你应该知道它是可以接受的。
第二种解决方案是使用CQRS + Event Sourcing等事件驱动架构。在这种情况下,您可以使用单独的聚合并使其保持同步,使用简单的Saga将Questionare
聚合(例如QuestionAdded
,QuestionRemoved
)中的某些事件作为命令转发给Campaingn
骨料。我更喜欢这种解决方案,因为它可以更好地区分责任。