13

1)

埃文的书,第 页。415:

此外,域模型的关键方面可能跨越多个有界上下文,但根据定义,这些不同的模型不能被结构化以显示它们的共同焦点。

a) 我假设引用暗示核心域 CD可以跨越多个有界上下文 BC

b) 我假设CD中的BC应该只包含核心元素,而不包含通用元素?如果是这样,这是否意味着我们应该始终考虑核心域来设计BCCD包含的那些)?换句话说,在我们开始设计BC之前,我们应该对CD是什么有一个大致的了解?

C)

...但根据定义,这些不同的模型不能被结构化以显示它们的共同焦点

我意识到BC的结构不应使外部世界能够立即弄清楚所有部分(即BC)如何组合在一起以及它们的共同目的是什么,但作者是否暗示这种结构(这将隐含地传达不同BC的共同目的)即使是偶然也不会发生?如果是这样,为什么?

2)域模型可能有几个通用子域 GS,但是一个GS可以跨越多个 BC吗?

更新:

1)

b)

我假设 CD 中的 BC 应该只包含核心元素,而不包含通用元素?...

在定义 BC 时,当然应该对核心域是什么有所了解。如前所述,理想情况下,它们应该是一对一的。但是,可以定义 BC 来满足处于非理想状态的系统的需要。

我假设您是在暗示,在非理想情况下,CD中的BC也可能包含一些非核心元素,并且在非理想情况下,CD可能包含多个BC

C)

一个域跨越多个 BC,但尽管有明确的边界,域行为当然可以跨越 BC。上下文映射可以描述这种跨 BC 交互。引用本身是基于域愿景声明的概念,其目的是突出核心域的价值并可能解释与 BC 的关系。

但是为什么作者使用“按定义”这个词,好像是在暗示BC不可能偶然也被构造成它们会显示出它们的共同焦点

2)

Domain Model 可能有几个 Generic Subdomains GSs ,但是一个 GSs 可以跨越多个 BCs 吗?

多个BC可以使用单个通用子域。我会在这里避免使用“跨度”一词,因为这过分强调了通用子域对整个域模型的重要性。

一个)

多个 BC 可以使用单个通用子域

不确定我是否理解您的回复。你是说一个GS 可以包含多个*BCs*?

b)

我会在这里避免使用“跨度”一词,因为这过分强调了通用子域对整个域模型的重要性。

也许是一个无用的问题,但您能否详细说明为什么使用“跨度”一词会使通用子域看起来比实际更重要?

回复贾科莫·泰西奥:

1)

b)

不,一些通用元素通常在核心域中发挥关键作用。例如,参见许多共享内核中存在的时间、货币和金钱:它们确实是通用的,但对核心域规则很重要。

因此,如果Core Domain使用通用元素(例如 Time、Currency 和 Money),那么唯一的实现选项是Shared Kernel(即,此通用元素Core Domain和任何其他需要它的域共享),但是如果泛型元素仅由Core Domain使用,那么我们不应该打扰Shared Kernel,而是应该直接在Core Domain中定义这个泛型元素

1)

c) 上下文边界在术语语义之后定义。在 BC 中,任何术语的含义都不应超过一件事(参见 SRP)。当您看到一个类在领域专家的心目中具有多个含义时,您就知道您混合了不同的 BC。

您能否扩展您的答案,因为我不明白您的答案与我的问题有何关系?

第二次更新:

1)

b)

也可能是单个 BC 包含多个子域。这通常并不理想,因为它可能表明混合的 BC。

在阅读这本书时,我并没有过多关注作者对“子域”一词的使用,但我很确定这本书并没有对子域是什么提供完整的定义。那么究竟什么是子域呢?只是一堆逻辑相关的领域概念?如果是,那么我假设一个子域不应该跨越多个BC吗?

2)

一个)

一个信号 GS 可以被多个 BC 使用。之所以如此,是因为子域是通用的。所以 GS 不包含 BC;相反,它被 BC 引用。

从您的回复看来,您似乎是在暗示通用子域从未实现为BC?为什么不呢,因为在我看来,不同的通用子域可能包含不同的模型,而BC似乎是分离这些通用模型的理想解决方案?!

3)您能否也帮我解决以下问题,因为这让我很困惑:如果Core Domain使用通用元素(例如 Time、Currency 和 Money ) ,那么唯一的实现选项是Shared Kernel(即这个通用的元素Core Domain和任何其他需要它的域共享),但如果通用元素仅由Core Domain使用,那么我们不应该打扰Shared Kernel,而是应该直接在Core中定义这个通用元素

谢谢你

4

2 回答 2

9

1a) 在这句话中,作者指的是整个域,而不是核心域。整个域可以跨越多个 BC。BC 和核心域之间的关系可能更复杂。域、子域和核心域是问题空间的元素。BC 是解决方案空间的产物。实际上,它们可能并不总是一对一的,但这是理想的。

1b) 在定义 BC 时,当然应该对核心域是什么有所了解。如前所述,理想情况下,它们应该是一对一的。但是,可以定义 BC 来满足处于非理想状态的系统的需要。

1c) 域跨越多个 BC,但尽管有明确的边界,域行为当然可以跨越 BC。上下文映射可以描述这种跨 BC 交互。引用本身是基于领域愿景陈述的概念,其目的是突出核心领域的价值,并可能解释与 BC 的关系。

2) 多个 BC 可以使用单个通用子域。我会在这里避免使用“跨度”一词,因为这过分强调了通用子域对整个域模型的重要性。

更新

1b) 一个核心域可能是用多个有界上下文实现的。这不一定是缺陷,在某些情况下是理想的。也可能是单个 BC 包含多个子域。这通常并不理想,因为它可能表明混合的 BC。

1c) 根据定义,BC 是物理分区的,不应该有直接的依赖关系。我想这就是作者所指的。他强调的问题是,您可以使用多个 BC,这需要解释,尤其是在处理单个子域时。

2a) 一个信号 GS 可以被多个 BC 使用。之所以如此,是因为子域是通用的。所以 GS 不包含 BC;相反,它被 BC 引用。

2b)拥有一个通用子域“跨度”系统可能表明它不是一个真正的通用子域,而是一个核心域。这并不是说不能在整个系统中使用通用组件,恰恰相反。然而,在这种情况下,跨越系统的组件只是一个技术轴。

更新 2

1b) 是的,子域是整个域的一个有凝聚力的组成部分。一个子域可以跨越多个 BC。这是可以接受的,因为 BC 是一个解决方案空间工件,它的存在可能存在技术原因甚至组织问题。例如,在线零售商的域中有一个产品目录子域。这将有一个相应的产品BC。然而,关于产品搜索的附加功能可以放在产品搜索 BC 中。这仍然是目录子域的一部分,但出于技术原因,它是一个新的 BC。另一方面,当单个 BC 包含多个子域时,这可能会出现问题。

2a)我认为我对跨度这个词的使用过于语义化。通用子域可以是 BC。但是,必须注意确保通用子域实际上以通用方式使用。

3) 是的。除此之外,像 Money 这样的基类可以为每个子域唯一地实现,即使它们在多个地方使用。有时复制粘贴是最好的模式。

于 2013-03-11T18:37:47.817 回答
3

1a) 是的,核心域本质上是一组有界上下文,从客户的角度来看,值得应用程序开发。

1b) 不,一些通用元素通常在核心域中发挥关键作用。例如,参见许多共享内核中存在的时间、货币和金钱:它们确实是通用的,但对核心域规则很重要。

1c) 上下文边界是在术语的语义之后定义的。在 BC 中,任何术语的含义都不应超过一件事(另请参见SRP)。它们几乎是语言边界!当你看到一个类在领域专家的心目中具有多个含义时,你就知道你混合了不同的 BC。

2)是的,通用子域是域模型(或有界上下文集)中有用但不是应用程序中心的那些部分。我已经使用通用子域构建了几个应用程序:当它们增加了客户希望支付的一些价值时(我无法通过简单的 CRUD 组件提供这样的价值)。

请注意,您的应用程序中的“核心领域”是一个定性定义:我已经多次看到成功应用程序的次要部分在客户的公司组织发生变化时实现重要性。因此,今天的核心领域可能不是明天。

于 2013-03-11T21:21:43.313 回答