Domain driven design 在应用领域驱动设计规则时,我如何划定界限;仅通过“聚合根”访问聚合;

Domain driven design 在应用领域驱动设计规则时,我如何划定界限;仅通过“聚合根”访问聚合;,domain-driven-design,Domain Driven Design,我们有一个SaaS应用程序 数据库中有公司、用户和实体的行(一般用于用户处理的内容) 所以A公司控制着A-F用户 用户A-C有权查看实体A 用户D-F有权查看实体B 当我为实体A及其聚合实体创建有界上下文时,实体A是否只能通过公司A访问 我试图找出在哪里应用规则“仅通过聚合根访问聚合” 我在哪里划界 当公司A和公司B都可以访问实体A时,情况如何?聚合的概念是它们代表一致性边界。这意味着应该可以同时加载两个不同的聚合,修改它们,并将它们保存回数据库。一旦您使同一实体成为多个聚合的一部分,就不再保证

我们有一个SaaS应用程序

数据库中有公司、用户和实体的行(一般用于用户处理的内容)

所以A公司控制着A-F用户

用户A-C有权查看实体A 用户D-F有权查看实体B

当我为实体A及其聚合实体创建有界上下文时,实体A是否只能通过公司A访问

我试图找出在哪里应用规则“仅通过聚合根访问聚合”

我在哪里划界


当公司A和公司B都可以访问实体A时,情况如何?

聚合的概念是它们代表一致性边界。这意味着应该可以同时加载两个不同的聚合,修改它们,并将它们保存回数据库。一旦您使同一实体成为多个聚合的一部分,就不再保证这一点。如果您这样做,那么在您的域中对一致性和并发性进行推理将变得非常困难

这就是一个实体必须只属于一个聚合的原因。


解决方案通常很简单:使实体成为自己的集合。这意味着您只能从之前关联引用它的聚合中按ID引用它。请注意,这也解决了“仅通过聚合根访问聚合”的问题。

有关聚合的概念是它们表示一致性边界。这意味着应该可以同时加载两个不同的聚合,修改它们,并将它们保存回数据库。一旦您使同一实体成为多个聚合的一部分,就不再保证这一点。如果您这样做,那么在您的域中对一致性和并发性进行推理将变得非常困难

这就是一个实体必须只属于一个聚合的原因。

解决方案通常很简单:使实体成为自己的集合。这意味着您只能从之前关联引用它的聚合中按ID引用它。请注意,这也解决了“仅通过聚合根访问聚合”的问题。

“仅通过聚合根访问聚合”不是聚合设计的有用规则。这只是编程时要记住的聚合概念的一个实际副产品——如果可以不受限制地直接访问任何实体,聚合基本上是无用的

在建模时,您应该寻找在同一业务事务中倾向于一起更改和/或必须保持一致的实体,并围绕这些实体绘制聚合边界

很可能,
公司
中的任何数据都不需要始终与其
实体
保持一致,并且它们不会一起更改,因此根据“保持聚合较小”的建议,您可能应该将它们设置为两个聚合。但是只有您知道域中的不变量,并且可以判断。

对于聚合设计来说,“仅通过聚合根访问聚合”不是一条有用的规则。这只是编程时要记住的聚合概念的一个实际副产品——如果可以不受限制地直接访问任何实体,聚合基本上是无用的

在建模时,您应该寻找在同一业务事务中倾向于一起更改和/或必须保持一致的实体,并围绕这些实体绘制聚合边界


很可能,
公司
中的任何数据都不需要始终与其
实体
保持一致,并且它们不会一起更改,因此根据“保持聚合较小”的建议,您可能应该将它们设置为两个聚合。但只有您知道域中的不变量,并且可以判断。

规则是仅通过聚合根访问实体。还有一条规则规定,聚合根只能通过标识引用。在不了解域的情况下,我倾向于认为公司、用户和实体都是聚合根,但这又取决于需要强制执行的不变量……规则是只通过聚合根访问实体。还有一条规则规定,聚合根只能通过标识引用。在不了解任何领域的情况下,我倾向于认为公司、用户和实体都是聚合根,但这取决于需要强制执行的不变量……我不同意。如果您发现实体
A
B
一直在一起变化,那么没有理由将它们放在单独的集合中。即使是
A
的两个实例可以引用
B
的同一个实例这一事实也不是一个有效的理由——就并发性而言,拆分聚合不会改变在给定时间段内争用修改
A
B
的客户端数量。不同意。如果您发现实体
A
B
一直在一起变化,那么没有理由将它们放在单独的集合中。即使是
A
的两个实例可以引用
B
的同一个实例这一事实也不是一个有效的理由——从并发角度看,拆分聚合不会改变在给定时间段内争用修改
A
B
的客户端数量。