Domain driven design 整体集合体根

Domain driven design 整体集合体根,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,我们如何处理下面有大量骨料的聚合根 假设我有一个Person作为我的聚合根,并且有大量实体表示一个人可以做的所有各种活动和事情。其中每一个都是彼此独立的,都有自己的生命周期,可能存储在不同的数据库中。它们都取决于人员的生命周期,但是,如果删除了人员,它们也都需要删除,因为它们不再相关 如果Person是所有这些对象的聚合根,我如何避免拥有一个试图覆盖所有这些对象的庞大存储库 如果这些东西都是它们自己的聚合根,可以拥有它们自己的存储库,那么可以吗?我处理的整个问题是,如果删除了人,确保级联删除?“

我们如何处理下面有大量骨料的聚合根

假设我有一个
Person
作为我的聚合根,并且有大量实体表示一个人可以做的所有各种活动和事情。其中每一个都是彼此独立的,都有自己的生命周期,可能存储在不同的数据库中。它们都取决于
人员的生命周期
,但是,如果删除了
人员
,它们也都需要删除,因为它们不再相关

如果
Person
是所有这些对象的聚合根,我如何避免拥有一个试图覆盖所有这些对象的庞大存储库

如果这些东西都是它们自己的聚合根,可以拥有它们自己的存储库,那么可以吗?我处理的整个问题是,如果删除了
人,确保级联删除?

“所有权”不一定意味着聚合

例如,
客户
“拥有”一个或多个
订单
实例,但这些实例不属于
客户
聚合,因为它们有自己的生命周期


级联删除可以由您的数据库技术强制执行,尽管这是另一个讨论。人们可能很少需要或希望从数据库中删除实例。停用
客户
可能是一种更可行的方法。在处理审计和/或立法等需要在最短时间内存储数据的情况下,这是一个更大的问题。存档是另一种选择。

聚合根目录提供了一种控制对
域中实体的访问的方法。这并不一定意味着您应该始终有一个聚合根。聚合根应该来自于您的业务需求,而不一定来自于它们在数据库中的存储方式

如果更新域的一部分对域的另一部分有影响。然后,
Domain Events
会有所帮助

“来自域”事件定义如下:

域事件是发生在域中的事件,您希望同一域(进程中)的其他部分知道它。通知的部分通常会对事件做出某种反应

因为域事件在内存中,所以您可以在生命周期结束时提交或回滚“整个事务”


也就是说,如果仅仅因为它太大而不适合您的用例,那么您不应该创建额外的聚合根。如果聚合根是巨大的,那么您可以使用特定于语言的特性来划分聚合根。例如,在
C#
中,我们有
部分类的概念。你可以潜在地创建多个
部分
个人
类,并将操作划分为不同的文件(如果使用C#)。

你能提供一个这样一个必须保护的巨大聚合和不变量的具体例子吗?我现在没有一个具体的例子,开始定义我正在研究的领域。我认为Eben Roux和Ankit Vijay提供的答案为我指出了我需要做的正确方向。我建议提供一个领域模型的原型,至少你如何看待它,即使它是错误的。然后我可以帮你确定边界