如何在应用领域驱动设计规则时画线 "only access aggregates via the aggregate root"
How do I draw the line when applying the Domain Driven Design rule "only access aggregates via the aggregate root"
我们有一个 SaaS 应用程序。
数据库中有公司、用户和实体的行(用户处理的内容通用)
因此公司 A 控制用户 A-F
用户A-C有权查看实体A
用户 D-F 有权查看实体 B
当我为实体 A 及其聚合实体创建限界上下文时,实体 A 是否只能通过公司 A 访问?
我正在尝试弄清楚在哪里应用规则 "only access aggregates via the aggregate root"。
我在哪里画线?
如果A公司和B公司都可以访问实体A呢?
关于聚合的想法是它们代表一致性边界。这意味着应该可以同时加载两个不同的聚合,修改两者,并将它们保存回数据库。一旦您将同一实体作为多个聚合的一部分,就不再有保证了。如果您这样做,在您的域中推理一致性和并发性变得 很多 困难。
这就是为什么一个实体必须只属于一个集合。
解决方案通常很简单:使实体成为它自己的聚合体。这意味着您只能通过 ID 从之前通过关联引用它的聚合中引用它。请注意,这也解决了您的 "only access aggregates via aggregate root" 问题。
"Only access aggregates via the aggregate root" 不是聚合设计的有用规则。这只是聚合概念的实际副产品,在编程时要牢记在心——如果您可以不受限制地直接访问任何实体,聚合基本上就没有用了。
在建模时,您应该寻找倾向于在同一业务事务中一起更改的实体and/or必须保持一致,并围绕这些实体划定聚合边界。
很可能 Company
中的数据不需要始终与其 Entities
保持一致,并且它们不会一起更改,因此凭借 "keep aggregates small" 建议,你应该把它们做成 2 个集合。但只有你知道你所在领域的不变量并且可以分辨。
我们有一个 SaaS 应用程序。
数据库中有公司、用户和实体的行(用户处理的内容通用)
因此公司 A 控制用户 A-F
用户A-C有权查看实体A 用户 D-F 有权查看实体 B
当我为实体 A 及其聚合实体创建限界上下文时,实体 A 是否只能通过公司 A 访问?
我正在尝试弄清楚在哪里应用规则 "only access aggregates via the aggregate root"。
我在哪里画线?
如果A公司和B公司都可以访问实体A呢?
关于聚合的想法是它们代表一致性边界。这意味着应该可以同时加载两个不同的聚合,修改两者,并将它们保存回数据库。一旦您将同一实体作为多个聚合的一部分,就不再有保证了。如果您这样做,在您的域中推理一致性和并发性变得 很多 困难。
这就是为什么一个实体必须只属于一个集合。
解决方案通常很简单:使实体成为它自己的聚合体。这意味着您只能通过 ID 从之前通过关联引用它的聚合中引用它。请注意,这也解决了您的 "only access aggregates via aggregate root" 问题。
"Only access aggregates via the aggregate root" 不是聚合设计的有用规则。这只是聚合概念的实际副产品,在编程时要牢记在心——如果您可以不受限制地直接访问任何实体,聚合基本上就没有用了。
在建模时,您应该寻找倾向于在同一业务事务中一起更改的实体and/or必须保持一致,并围绕这些实体划定聚合边界。
很可能 Company
中的数据不需要始终与其 Entities
保持一致,并且它们不会一起更改,因此凭借 "keep aggregates small" 建议,你应该把它们做成 2 个集合。但只有你知道你所在领域的不变量并且可以分辨。