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提供的答案为我指出了我需要做的正确方向。我建议提供一个领域模型的原型,至少你如何看待它,即使它是错误的。然后我可以帮你确定边界