Domain driven design 协调父/子关系上的小聚合和不变量

Domain driven design 协调父/子关系上的小聚合和不变量,domain-driven-design,Domain Driven Design,首先,我对总量的理解/估算。 *聚合是唯一可以直接访问的域对象。如果聚合具有子级,则必须通过聚合访问子级。 *聚合可以通过id引用其他聚合。这意味着我可以通过其存储库加载聚合A,获得聚合B的id引用,并通过存储库加载B。 *如果根聚合和子实体同时独立更新,则大型聚合可能会导致并发问题 例如,我有一个基于章节的会员制。各章都有成员。用户应该能够在同一时间对不同的成员进行更改,这样我就可以使每个章节和成员都有自己的聚合 但是我们有一个规则说 A) 成员必须属于某一章 B) 一个章节不能有两个名字和

首先,我对总量的理解/估算。 *聚合是唯一可以直接访问的域对象。如果聚合具有子级,则必须通过聚合访问子级。 *聚合可以通过id引用其他聚合。这意味着我可以通过其存储库加载聚合A,获得聚合B的id引用,并通过存储库加载B。 *如果根聚合和子实体同时独立更新,则大型聚合可能会导致并发问题

例如,我有一个基于章节的会员制。各章都有成员。用户应该能够在同一时间对不同的成员进行更改,这样我就可以使每个章节和成员都有自己的聚合

但是我们有一个规则说

  • A) 成员必须属于某一章
  • B) 一个章节不能有两个名字和出生相同的成员 日期
A觉得我应该有这样的代码

 var member = chapter.EnrollMember(memberInfo);
如果章节已经有一个成员与为B传递的参数相匹配,那么代码应该抛出一个错误。但是如果章节聚合只有对其他成员的id引用,它应该如何获得这些成员

  • 是否传入成员存储库
  • 是否将成员名称签出章节聚合并移动到域服务中

注:这是一种假设情况。我想看看这种情况是如何建模的,而不是是否应该这样建模。

在域中处理大型集合的集合验证通常是不实际的。如果您使用的是关系数据库,则可以使用唯一约束潜在地保护此不变量

另一种方法是依赖于最终的一致性,即在规则被破坏后检测到它们,并发出补偿操作(自动或手动)。为了确定最终一致性是否是一种选择,您必须评估打破这一规则对业务的成本,这就是为什么对假设场景建模没有那么大帮助的原因。在现实世界中,你会问为什么成员不能有相同的名字和出生日期如此重要(在现实世界中完全可能)?如果这一规则被打破,这将给企业带来多少成本?如果命令在发送之前在UI上进行了验证(例如在UI上进行唯一性检查),那么这种情况发生的频率有多高

如果成员身份唯一性策略极其重要,必须具有强一致性,但过于复杂,无法建模为唯一约束,则可以建模仅保持最小状态以保护不变量的AR,而所有其他成员详细信息都在单独的AR上处理。例如,成员的
姓名
出生日期
状态
可以建立在
中的
章成员
实体的模型,而
章成员档案
AR可以保存不受设置验证约束的其他详细信息

//Enroll
var memberProfile = chapter.enrollMember(name, birthdate, avatarFilePath);

transaction {
    save(memberProfile);
    save(chapter);
}

//Change avatar for a given chapter
var memberProfile = find(chapterId, name, birthdate);
memberProfile.changeAvatar(avatarFilePath);

save(memberProfile);

//Disenroll (you could also modify memberProfile in the same transaction for this specific use case -- if needed)
chapter.disenrollMember(name, birthdate);

save(chapter);

你会跟进更多的问题细节吗?不确定你的评论是什么意思。你最后做了什么?;)