domain-driven-design - 多个聚合根之间的关系
问题描述
在许多应用程序中,我与用户和金融公司打交道(例如),长期以来,我一直在努力根据领域驱动设计原则对两者之间的关系进行建模。
在我的系统中,我可以执行以下操作:
- 将用户添加到现有财务公司。
- 将金融公司添加到现有用户。
我相信两者都是聚合根......金融公司和用户。
我如何建模两者之间的关系?是 FinanceCompany.Users 吗?还是 User.FinanceCompanies?不是吗?还是我缺少一些关键 DDD 概念的知识?问题是如果我选择一种方式而不是另一种方式,则代码从一个聚合根入口点更容易理解/清晰,但不是另一个。有时导航到财务公司并向其添加用户更有意义,而有时导航到特定用户并向用户添加财务公司更有意义。
有没有更好的方法来解决这个问题,也许是通过存储库方法?是否有一些我在这里没有得到或理解的关键概念?假设财务公司和用户之间的关系属于 2 个 AR 中的任何一个都是不正确的。当我存储关系时,我必须将其存储在名为 FinanceCompanyUsers 或 UserFinanceCompanies 的表中,但它似乎仍然不清楚。
我会有 FinanceCompany.AddUser() 和 User.AddFinanceCompany() 之类的代码吗?还是有一些完全不同的方法来处理这样的关系?
解决方案
您已经确定两者User
和FinanceCompany
都是聚合,因此每个都有自己的生命周期。
许多领域的问题是我们对关系没有完整的理解。作为另一个例子,我们可以采用 anOrder
和 a Product
。两者都是聚合,但我们会有Order.AddProduct()
orProduct.AddOrder()
吗?在这种情况下,很明显 anOrder
包含有限的Product
条目子集,而 aProduct
很可能包含许多订单,我们对这种关系不太感兴趣,因为它是一个相当弱的关系。AProduct
可以在没有附加任何订单的情况下存在并且有效,但如果Order
没有至少一个产品条目,则 an 非常无用。这意味着Order
有一个不变量OrderItem
条目。除此之外,我们对这个陈腐的例子有足够的了解,我们知道我们将需要一个关联实体(在关系理论中),因为我们需要有关关系的更多信息,并且进入战斗将是我们的OrderItem
表。奇怪的是我还没有看到它叫OrderProduct
.
我建议的指导是选择最合适的一方。
但是,如果没有一方是真正的赢家,并且两个聚合都可以在没有与另一方的关系的情况下存在,那么关系本身就是您肯定提到的聚合。也许它不仅是一个UserFinanceCompany
集合,而且可能是领域专家所引用的无处不在的语言中缺少的一个概念。也许类似Auditor
或类似的东西代表了这种关系。这类似于OrderItem
orOrderLine
概念,而不是OrderProduct
.
推荐阅读
- flutter - 文本字段对齐
- reactjs - 从不传递道具的子组件表单中获取输入?
- oracle - 恢复 oracle 数据库时列大小减小
- php - 选择一行 WHERE 列 + x 分钟
- ruby-on-rails - 如何更改mapbox中popupwindow的css?
- label - Mapbox Studio:从上传的图层添加标签
- java - 在 IntelliJ 社区中设置 Apache Derby 数据库
- ruby-on-rails - 如何在 Nginx 和 Unicorn for Rails 应用程序上配置 SSL?
- javascript - 导出变量以在 JavaScript 中的其他模块中使用
- flutter - 没有 AutoId 的 Firestore 嵌套集合!如何用代码创建?