对限界上下文和子域感到困惑

Posted

技术标签:

【中文标题】对限界上下文和子域感到困惑【英文标题】:Confused about Bounded Contexts and SubDomains 【发布时间】:2013-09-08 15:40:45 【问题描述】:

我读过 Eric Evan 的书,现在正在读 Vaughn Vernon 的书。我在第二章中,他谈到了子域和有界上下文,现在完全糊涂了。

据我所知,BC 和 SD 之间应该存在 1:1 的关系。但是,我在其他地方读到不一定是这种情况。

谁能向我解释一下 BC 和 SD 之间的关系?

【问题讨论】:

也许解释一下 BC 和 SD 之间的区别会有所帮助 【参考方案1】:

子域是您业务的一部分。有核心域、支持域和通用域。核心域是钱的所在,支持域支持您的核心业务,而通用域是您需要的域,但并不在意,因此您可能会立即购买它们。对于保险公司而言,核心领域是保险,支持领域可能是客户组合,而通用领域可能是时间表。

一般来说,有界上下文是无处不在的语言一致的边界。在 DDD walhalla 中,每个子域都将存在于自己的有界上下文中。然而,实际上,存在遗留问题,有些包试图一次完成所有事情......这将迫使各种尴尬的关系。

【讨论】:

如果一个子域将存在于它自己的有界上下文中,这意味着有界上下文比子域更广泛。但是从我从 Vaughn Vernon 的书中得到的信息来看,在一个子域中你可以有多个有界上下文。所以也许说每个 BC 都生活在其 SD 中会更正确。我错了吗?【参考方案2】:

我尝试用我的理解来解释这些概念。

在 DDD 中,一切都应该用通用语言进行沟通,以便技术团队和业务团队可以使用相同的术语并对问题有相同的看法

DDD 中的 代表了业务中的实际问题。如:电子商务是一个域,Payroll系统是一个域 域被划分为许多子域,因此每个子域关注较小的问题。如:电子商务有很多子域如:Shopping Cart、Billing、Product Catalog、Customer Information... 每个子域都应该有明确的职责,因此它有一个边界来限制它们的功能,这个边界将有助于子域专注于只做一件事并做好。这个边界被认为是子域的有界上下文。有界上下文将定义: 子域需要多少个域模型? 每个模型需要哪些属性? 子域需要哪些功能?

例如:购物车子域需要模型:购物车、产品、客户信息...并包含在购物车上执行 CRUD 的功能。注意: Shopping Cart 子域中的 Product 和 Customer 模型可能与 Product Catalogs 和 Customer Profiles 子域中的模型不同,它们只是包含了在 Shopping Cart 上显示的必要属性。

【讨论】:

【参考方案3】:

Vaughn Vernon 在他的“实施领域驱动设计”一书中指出“子领域存在于问题空间中,而有界上下文存在于解决方案空间中”

想象一下正在开发支持牙医的软件。牙医有两个问题:修复患者的牙齿和为患者预约。修复牙齿是核心领域,预约是辅助领域。在核心域中,医务人员关心患者的牙科病史,他们是否可以进行全身麻醉,他们目前的问题是什么等。在子域中,工作人员(不一定是医务人员)关心患者的联系信息,日期以及最适合医生和患者的时间、所需的牙科工作类型等。这两个领域都需要一个患者模型,但该模型将取决于我们为确保正确信息和解决每个领域的问题时都可以使用功能。 阅读https://robertbasic.com/blog/bounded-contexts-and-subdomains/

【讨论】:

【参考方案4】:

从蓝皮书重读了 18 遍 Booking Context,这让我终于掌握了窍门。 http://codeidol.com/csharp/domain-driven-design/Maintaining-Model-Integrity/Bounded-Context/

这篇文章也有帮助:http://gorodinski.com/blog/2013/04/29/sub-domains-and-bounded-contexts-in-domain-driven-design-ddd/

【讨论】:

很好,但如果您从文章中复制到这里回答问题的内容,那就太好了! 这里是第二篇文章的总结:子域划定一个域,存在于问题空间中。有界上下文界定了域模型并存在于解决方案空间中。理想的情况是子域和有界上下文之间完全对齐,但在实践中,在这方面必须接受一定程度的灵活性。 不同意 gorodinksi 链接,因为他在技术意义上说得太多,而在商业意义上说得不够。 @JefClaes 的回答要好得多。 第一个链接好像坏了【参考方案5】:

请查看this 链接,它会对您有所帮助, 有界上下文还是上下文? 术语上下文是一组概念的一般描述,术语有界上下文更具体 - 有界上下文是应用程序的一个区域,它具有明确定义的边界,有自己的模型,并维护自己的代码。在有界上下文中,一切都应该严格一致。

通常,我们可以互换使用上下文和有界上下文这两个术语,尽管我倾向于用上下文来谈论事物的业务方面,而有界上下文则涉及技术实现。

【讨论】:

【参考方案6】:

Vaughn Vernon 在他的“实施领域驱动设计”一书中陈述如下:

“将子域与限界上下文一对一对齐是一个理想的目标。”第 57 页

【讨论】:

【参考方案7】:

当两种不同的语言谈论相同或相似的事物时,该事物在 2 个不同的上下文中被引用。您可以在一定程度上在 2 个上下文中翻译该事物。

同样,一个术语在不同部门可能有不同的含义。在这种情况下,不同的上下文对该术语的解释不同。两者之间的翻译在某种程度上是可能的。

与其说“有界上下文”,不如试着说“有界世界”

【讨论】:

以上是关于对限界上下文和子域感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

DDD中限界上下文与通用语言的作用

DDD领域设计概念梳理

DDD领域设计概念梳理

DDD 实战 :限界上下文映射和系统分层架构

限界上下文内部和外部的事件溯源

限界上下文