领域驱动设计聚合根设计

Posted

技术标签:

【中文标题】领域驱动设计聚合根设计【英文标题】:Domain Driven Design aggregate root design 【发布时间】:2013-10-29 00:31:54 【问题描述】:

您好,我正在尝试对一个简单的类集群进行 DDD。

举个例子。

我有渠道和贷方。

频道 = 频道 A、频道 B 贷方 = 银行 A、银行 B、银行 C

通道 A 有 Bank A, B 通道 B 有 Bank B, C

在这种情况下我将如何设计我的聚合根?

聚合 id 应该是银行特定的吗?还是应该是特定于频道的?

在我的其他聚合中,我只想知道它是 ChannelA-BankA 还是 ChannelB-BankC,也就是一个唯一的 Id。

在我看来,我可以将 Channel 设置为聚合根实体,或者将 Bank 设置为聚合根实体,这不会有什么不同吗?它们是一对一的关系。

或者我应该创建一个***类作为根并引用 Channel 和 Bank?

有什么建议吗?

【问题讨论】:

1 对 1、多对多等在 DDD 中没有位置,这些是 rdbms 思维方式工件,避免使用它们。领域对象对领域概念、行为和用例进行建模。使用的语言必须是领域专家使用的语言(而不是基于特定技术的技术语言)。 【参考方案1】:

聚合设计总是很棘手,您对领域的了解越深,它就会变得越容易。对于一个局外人来说,帮助是相当困难的(或不可能的):)

但请记住,这不一定是“哪一个是聚合?”的问题。在您的情况下,很可能 both 都是聚合,并且您通过值对象 (VO) 或 Id 将它们链接起来。例如,您可以使用 ChannelChannelLender VO,并且在您拥有 Channel/Bank 链接的那些“其他”聚合中,您可以使用其他一些 VO,并且由于使用了 ChannelLender,您将需要一个代表该概念的通用语言 (UL) 名称。

希望对您有所帮助。

【讨论】:

以上是关于领域驱动设计聚合根设计的主要内容,如果未能解决你的问题,请参考以下文章

基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

领域驱动设计中实体和聚合之间的区别

如何运用领域驱动设计 - 聚合

领域驱动设计:如何设计具有依赖关系的关系聚合

应用领域驱动设计规则“仅通过聚合根访问聚合”时如何画线

领域驱动设计 DDD的一些基础概念