【问题标题】:Monolithic aggregate roots整体聚合根
【发布时间】:2020-03-05 16:57:43
【问题描述】:

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

假设我有一个Person 作为我的聚合根,并且有大量的实体代表一个人可以做的所有各种活动和事情。它们中的每一个都明显相互分离,并有自己的生命周期,并且可以存储在不同的数据库中。它们都依赖于 Person 的生命周期,但是,如果 Person 被删除,它们也都需要被删除,因为它们不再相关。

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

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

【问题讨论】:

  • 您能否提供一个必须保护的如此庞大的聚合和不变量的具体示例?
  • 我现在没有一个充实的例子,开始定义我正在研究的领域。我认为 Eben Roux 和 Ankit Vijay 提供的答案为我指明了正确的方向关于我需要做什么。
  • 我建议提供你的领域模型的原型,至少你如何看待它,即使它是错误的。然后我可以帮你确定界限。 ;)

标签: domain-driven-design aggregateroot


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    如果更新域的一部分会影响域的另一部分。那么,Domain Events 可以提供帮助。

    来自Microsoft Docs域事件定义如下:

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

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

    也就是说,如果它不适合您的用例,您不应该创建额外的聚合根,因为它很笨重。如果出于所有正确的原因聚合根很大,您可以使用特定于语言的功能来划分聚合根。例如,在C# 中,我们有partial class 的概念。您可能会创建多个 partial Person 类并将操作分成不同的文件(如果使用 C#)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      相关资源
      最近更新 更多