核心域可以跨越多个有界上下文吗?

use*_*291 9 domain-driven-design

1)

埃文的书,pg.415:

此外,域模型的关键方面可能跨越多个有界上下文,但根据定义,这些不同的模型无法构建以显示其共同焦点.

a)我假设引用暗示Core Domain CD可以跨越几个有界上下文 BC

B)我假设的BCCD应该只包含核心要素,但没有通用的元素?如果是这样,那是不是意味着我们应该始终设计具有核心域的BC(CD包含的那些)?换句话说,在我们开始设计BC之前,我们应该对CD是什么有一些大概的了解?

C)

......但根据定义,这些不同的模型无法构建以显示其共同焦点

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

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

更新:

1)

b)

我假设CD中的BCs应该只包含核心元素,但没有通用元素?...

人们当然应该知道在定义BC时核心域是什么.如上所述,理想情况下,它们应该是一对一的.然而,可以定义BC以满足处于非理想状态的系统的需要.

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

C)

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

但是,为什么作者使用" 按定义 " 这个术语,好像暗示不可能意外地将BC结构化以使他们能够展示他们的共同焦点

2)

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

多个BC可以使用单个通用子域.我会避免使用术语"跨度",因为这过分强调了通用子域对整个域模型的重要性.

一个)

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

不确定我理解你的回复.你是说单个 GS可以包含多个*BC*?

b)

我会避免使用术语"跨度",因为这过分强调了通用子域对整个域模型的重要性.

也许是一个无用的问题,但是你能详细说明为什么使用术语" span "会使Generic Subdomain看起来比它实际上更重要吗?

回复Giacomo Tesio:

1)

b)

不,一些通用元素通常在核心域中起关键作用.请参阅例如许多共享内核中存在的时间,货币和资金:它们非常通用但对核心域规则很重要.

因此,如果核心域使用通用元素(例如时间,货币和货币),则只有实现选项是共享内核(即,这个通用元素Core Domain和需要它的任何其他共享),但如果一般元素使用核心领域,那么我们不应该费心共享内核,而应该定义这个通用的元素直接在核心领域

1)

c)上下文边界是在术语的语义之后定义的.在BC省,任何术语都不应该意味着不止一件事(参见SRP).如果您发现某个类在域专家的脑海中有多个含义,那么您就知道您混合了不同的BC.

你可以稍微扩展一下你的答案,因为我不明白你的答案与我的问题有什么关系?

第二次更新:

1)

b)

也可能是单个BC包含多个子域.这通常不理想,因为它可能表明BC混为一谈.

在阅读这本书时,我并没有太注意作者对" 子域 " 这个术语的用法,但我很确定这本书没有提供对子域名的全面定义.究竟什么是子域?只是一堆逻辑相关的域名概念?如果是,那么我假设一个子域不应该跨越几个BC

2)

一个)

单个GS可以由多个BC使用.这是因为子域是通用的.所以GS不包含BC; 相反,它由BC引用.

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

3)你能否帮助我解决以下问题,因为它让我很困惑:如果核心域使用了泛型元素(如时间,货币和金钱),那么只有实现选项是共享内核(即这个通用的)元件由两个共享核心结构域和任何其它子域(多个)需要它的),但如果通用元件使用核心结构域,那么我们不应该与打扰共享内核,而应该限定这个通用元件直接在核心领域

谢谢

eul*_*rfx 8

1a)在该引用中,作者指的是整个域,而不是核心域.整个域可以跨越多个BC.BC和核心域之间的关系可能更复杂.域,子域和核心域是问题空间的元素.BC是解空间的工件.实际上,它们可能并不总是一对一,但这是理想的.

1b)在定义BC时,当然应该知道核心域是什么.如上所述,理想情况下,它们应该是一对一的.然而,可以定义BC以满足处于非理想状态的系统的需要.

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

2)多个BC可以使用单个通用子域.我会避免使用术语"跨度",因为这过分强调了通用子域对整个域模型的重要性.

UPDATE

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

1c)根据定义,BC是物理分区的,不应具有直接依赖性.我认为这是作者所指的.他强调的问题是,您可以在多个BC中发挥作用,这需要解释,特别是在解决单个子域时.

2a)单个GS可以由多个BC使用.这是因为子域是通用的.所以GS不包含BC; 相反,它由BC引用.

2b)具有通用子域"跨越"系统可以指示它实际上不是通用子域,而是核心域.这并不是说通用组件不能在整个系统中使用,恰恰相反.但是在这种情况下,跨越系统的组件只是一个技术轴.

更新2

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

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

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