DDD 中的上下文映射和有界上下文有什么区别?

meh*_*hdi 2 subdomain domain-driven-design bounded-contexts

我刚开始学习 DDD 概念,但我无法理解一些东西。

1-上下文映射与有界上下文和子域有什么区别?

2-如何识别限界上下文之间的关系?

Dev*_*iss 5

正如@Augusto 提到的,这是蓝皮书中的几章,但这里是。

领域模型可以在业务规则和人们的交谈方式中找到,但它的简化是在代码中捕获的。某些命名是一致的,并且在模型中强制执行必要的不变量。

界上下文主要是概念性的(也可能是代码中的命名空间、模块、项目......)。目的是保持领域模型内部的一致性。因此,在上下文中,使用了某种普遍存在的语言。模型只需要满足该上下文的需求。它是模型可以使用的边界。在认识这些关系方面?有些可能很微妙,但大多数则不然。至少团队中的一些人希望通过统一模型来“避免重复”……所以这清楚地表明存在某种关系。名称通常相同或相似...或者可能相同,但一个更适合一个域,另一个更适合另一个域。

上下文地图更像是一个项目管理工具。它是不同上下文(以及其中的模型)如何相互关联的地图。在电子商务系统的订购域中,您可能有一个产品。尝试在跨越订购付款、 网站内容和库存域(例如)的模型中拥有统一的产品会导致很多复杂化。因此,每个领域都应该有一个单独的模型。上下文映射是将这些有界上下文关联在一起的图表和相关文档,因为当订单流经系统时,从一个模型到下一个模型之间会存在数据关系和转换。

您询问的最后一个元素是子域。这里您可能指的是通用子域。就我个人而言,我认为这个名字有点令人困惑。它使它看起来像是模型的子集。也许这是故意的,但我通常认为它们是他们自己的领域,只是一个不是业务主张核心的领域。例如,如果上述电子商务公司以当日或次日送达而闻名,那么他们可能不应该购买现成的库存和运输管理解决方案。另一方面,如果他们专注于一个只想要最便宜的交易但不介意等待几天的市场,那么这将是通用子域的完美候选者。

我的 DDD 术语表底部有很多指向更详细文章的链接。

如果您认真学习这门学科并且可以获得一些书籍:

  • Eric Evans 的领域驱动设计
  • 实施领域驱动设计 作者:Vaughn Vernon
  • 由 Scott Wlaschin 实现的领域驱动设计(我最喜欢的)


cho*_*o70 5

正如评论中所说,这是一个广泛的主题,并且在 DDD 中非常重要。它是DDD的战略部分。无论如何,我会尝试通过整体解释来回答您的问题:


DDD 是关于理解和提炼我们想要解决的问题的领域。这是一个不断学习该领域、与领域专家交谈的过程。所有的人(开发人员、业务人员等)都说同一种语言。这种语言随处可见(对话、文档、源代码……)。它被称为通用语言(UL)。

问题域可能具有不同的功能区域,这些功能区域也可能是域。它们是子域。因此,子域是问题域的子集。这就像将问题分成更小的子问题,子域就是子问题的域。子域有3种:

  • 核心:蒸馏的目的是发现对业务有价值的子域,即使您的产品比其他同类产品更好的子域。这样的子域就是“核心子域”。例如,在“项目管理”中,“任务分配”将是核心。

  • 支持:专注于某些有助于核心功能的业务方面。例如,在“项目管理”中,有一个“日历”(用于标记任务交付日期)。

  • 通用:任何类型的应用程序可能需要的功能。例如,用户的认证和授权。

子域属于问题空间。

为了解决这个问题,您需要对子域进行建模,并创建有界上下文(BC)。实际上,BC 是一个自治应用程序,包含子域的软件模型。BC 有自己的 UL。这是 UL 术语具有含义的上下文。UL 和 BC 是 DDD 中最重要的东西。UL 驱动 BC 识别。

理想情况下,您应该将问题空间的子域与解决方案空间的 BC 进行 1:1 对齐,即每个子域都应该有一个 BC。

一个团队可以开发一个或多个 BC,但一个 BC 只能由一个团队开发。

BC 属于解空间。

上下文图:它是显示 BC 以及它们之间的关系的图。每个关系都分为以下模式之一:

  • 合伙
  • 共享内核
  • 客户-供应商
  • 墨守成规者
  • 反腐层
  • 开放主机服务
  • 发布语言
  • 分道扬镳
  • 大泥球

认识到在关系中应用哪种模式将取决于您的具体情况。您必须考虑的一些事情是:

  • 两个团队一起协作。
  • 其中一支球队并不关心另一支球队。
  • 团队可以协商。
  • 团队是独立的。
  • 模型(上游)的更改会影响另一个模型(下游)。