DDD - 由于聚合数据不同而导致多个限界上下文?
DDD - Multiple Bounded Contexts because of differing aggregate data?
我们尝试将我们的域拆分为有界上下文,目标是拥有一个模块化应用程序 design/architecture。
我们做了一个很有启发性的 EventSorming session,这对我们识别有界上下文及其聚合有很大帮助。研讨会结束后,每位参与者都同意我们确定的限界上下文。
尽管如此,我们还是感到不舒服,因为我们担心我们的限界上下文仍然太大。 EventStomring 专注于领域事件/过程,这是我们用来识别限界上下文的主要构建块。
我们还确定了像 "Contract" 这样的聚合体。每个合同几乎都遵循相同的过程,但是这些合同包含的数据量可能大相径庭。有非常简单的合同类型和包含大量附加数据和附件的合同类型。
仅仅因为聚合的数据更复杂就声明另一个限界上下文有意义吗?
两种方法都有其缺点:
- 在一个限界上下文中实现所有契约类型可能会导致代码中出现大量 if-Statements 以处理不同的数据。
- 提取新的限界上下文可能会因为某些数据不同而导致大量重复代码。
关于如何处理此问题的任何建议/最佳做法?
限界上下文与 if 语句关系不大,所以我不确定你的意思。
限界上下文是一组语义上封闭的业务功能。基本上,如果您的限界上下文可以完全隔离地执行其功能,即使其他上下文不可用。
除此之外,您可以在上下文中进行任何设计。我觉得 if 语句的数量更多地取决于你的 class/code-design,比如你是否正确使用多态性、接口等等。
但是,就您的观点而言:您不需要第一次就把所有事情都做到完美。如果您确定了一些有效的上下文,那么您已经完成了困难的部分。如果任何上下文可以进一步划分,那可能会在以后的任何时候发生,而对其他人的影响很小(因为上下文或多或少是孤立的)。
- 没有针对不同类型合同的特定业务团队
- 没有针对特定类型合约的专门开发团队
- 所有合同都使用相同的通用语言
- 每个合同几乎都遵循相同的流程
对我来说,这些迹象表明所有合同都属于同一个业务子域,并且理想情况下应该在同一个限界上下文中——除非遗留或第三方系统强制你这样做。
...domain events / process and that's the major building block we used
to identify our bounded contexts
BC不是进程识别的,BC是跟语言有关的。每个 BC 都有自己的通用语言 (UL)。 BC 是概念在其中具有意义的上下文。不管怎样,BCs 属于解决方案 space。首先,您应该探索域(问题 space)并将其拆分为子域,提取核心域。然后你为每个子域建模。 BC 是模型所在的环境。理想情况下,子域和 BC 之间的关系是 1:1.
发现子域的过程是迭代的,当您更了解域并与专家交谈时,您会找到它们。当你发现一个词可能有不同的意思,或者两个不同的词有相同的意思,那么就意味着你跨越了BC之间的界限。
所以,子域名的识别不在于流程,而在于概念和UL。
Is it meaningful to declare another bounded context just because the
aggregate's data is more complex?
不,您不应该仅仅因为聚合很复杂就任意创建 BC。 BC 基于 UL。
Any suggestions / best practices how to handle this?
你应该通过与领域专家交谈来了解更多关于领域(契约、类型等)的信息,并研究你的聚合(事务一致性)......无论如何,如果你将你的聚合拆分成另一个,它不会意味着它们属于不同的 BC,它们仍然可以属于同一个 BC。一个 BC 可以有多个聚合体。这完全取决于您的具体领域。
我们尝试将我们的域拆分为有界上下文,目标是拥有一个模块化应用程序 design/architecture。
我们做了一个很有启发性的 EventSorming session,这对我们识别有界上下文及其聚合有很大帮助。研讨会结束后,每位参与者都同意我们确定的限界上下文。
尽管如此,我们还是感到不舒服,因为我们担心我们的限界上下文仍然太大。 EventStomring 专注于领域事件/过程,这是我们用来识别限界上下文的主要构建块。
我们还确定了像 "Contract" 这样的聚合体。每个合同几乎都遵循相同的过程,但是这些合同包含的数据量可能大相径庭。有非常简单的合同类型和包含大量附加数据和附件的合同类型。
仅仅因为聚合的数据更复杂就声明另一个限界上下文有意义吗?
两种方法都有其缺点:
- 在一个限界上下文中实现所有契约类型可能会导致代码中出现大量 if-Statements 以处理不同的数据。
- 提取新的限界上下文可能会因为某些数据不同而导致大量重复代码。
关于如何处理此问题的任何建议/最佳做法?
限界上下文与 if 语句关系不大,所以我不确定你的意思。
限界上下文是一组语义上封闭的业务功能。基本上,如果您的限界上下文可以完全隔离地执行其功能,即使其他上下文不可用。
除此之外,您可以在上下文中进行任何设计。我觉得 if 语句的数量更多地取决于你的 class/code-design,比如你是否正确使用多态性、接口等等。
但是,就您的观点而言:您不需要第一次就把所有事情都做到完美。如果您确定了一些有效的上下文,那么您已经完成了困难的部分。如果任何上下文可以进一步划分,那可能会在以后的任何时候发生,而对其他人的影响很小(因为上下文或多或少是孤立的)。
- 没有针对不同类型合同的特定业务团队
- 没有针对特定类型合约的专门开发团队
- 所有合同都使用相同的通用语言
- 每个合同几乎都遵循相同的流程
对我来说,这些迹象表明所有合同都属于同一个业务子域,并且理想情况下应该在同一个限界上下文中——除非遗留或第三方系统强制你这样做。
...domain events / process and that's the major building block we used to identify our bounded contexts
BC不是进程识别的,BC是跟语言有关的。每个 BC 都有自己的通用语言 (UL)。 BC 是概念在其中具有意义的上下文。不管怎样,BCs 属于解决方案 space。首先,您应该探索域(问题 space)并将其拆分为子域,提取核心域。然后你为每个子域建模。 BC 是模型所在的环境。理想情况下,子域和 BC 之间的关系是 1:1.
发现子域的过程是迭代的,当您更了解域并与专家交谈时,您会找到它们。当你发现一个词可能有不同的意思,或者两个不同的词有相同的意思,那么就意味着你跨越了BC之间的界限。
所以,子域名的识别不在于流程,而在于概念和UL。
Is it meaningful to declare another bounded context just because the aggregate's data is more complex?
不,您不应该仅仅因为聚合很复杂就任意创建 BC。 BC 基于 UL。
Any suggestions / best practices how to handle this?
你应该通过与领域专家交谈来了解更多关于领域(契约、类型等)的信息,并研究你的聚合(事务一致性)......无论如何,如果你将你的聚合拆分成另一个,它不会意味着它们属于不同的 BC,它们仍然可以属于同一个 BC。一个 BC 可以有多个聚合体。这完全取决于您的具体领域。