DDD编写多个有界上下文

时间:2015-02-22 07:46:18

标签: domain-driven-design

我想了解有限上下文集成的建议。 我有一个把我放在角落里的用例:

  • 我对Contract管理层有一个有限的背景。我可以在合同中添加各方(例如各种外部组织)。为每一方选择他们的投资/贡献(例如:总数的10%)。 SO合同管理有两个方面:一个是行政管理(添加方,管理多个日期,......)另一个是财务(计划多年的捐款,检查捐款消费,......)。
  • 我有Budget的另一个有界背景。此上下文负责组织级别的费用管理。示例:服务A将具有1000€的费用容量。我们可以计划预算,然后每个组织方可以消费,购买东西,他们的一部分。为了建立预算,负责企业预算的用户可以直接分配资金或整合年度合同财务部分。当我们在预算中集成合同部分时,我们冻结了预算内的数据,即我们从另一个数据库表中复制货币数据(添加一些审计信息)。我们有一个数据库。

这是我奋斗的最后一部分。每个有界上下文都是专用的应用程序。在budget应用程序中,在将合同部分集成到当前预算中之后,我需要显示预算明细行。不幸的是,在预算表中我只有钱数据,而不是关于合同的一些基本信息(对象,参考,......)。

我在想什么:

  • 有时在有界上下文之间复制数据并不错。我冻结了合同的钱部分。我也可以冻结/复制合同的对象和参考。然后查询只会在budget context内进行。但这里存在的问题是数据重复。今天我需要对象/ refrerence,如果明天我需要更多字段......我将需要域事件管理来保持合同/预算之间的数据同步。
  • 查询预算,并为每行查询将返回所需数据的contract服务。这使每个上下文保持自治,但我需要发出大量数据库请求来丰富budget details line个对象。
  • 在数据库级别只有一个连接,我们可以使这个工作。在这里耦合怎么样?这是一个简单的解决方案,我们今天正在做什么(它是一个共享内核吗?)。在没有重建预算申请的情况下,我们似乎无法改变contract结构。我没有在上下文之间签订程序化合同。

我的问题是:

如何构建需要budget context数据的UI屏幕,每个详细信息行都需要来自contract context的数据?

附注:

  • 从一开始,也许背景识别和周长是错误的(这是传统设计)。
  • 我想要的是保持上下文分离(松散耦合)。如果我们可以在上下文之间指定设计合同,那么维护更容易(或不是?)。
  • 我没有看到如何集成这些上下文(我需要重新读取共享内核,ustream /下游等)。

1 个答案:

答案 0 :(得分:1)

这是一个额外的,独特的有界背景。它与现有的有界上下文有一些重叠,这很容易导致你走错路径(合并上下文或在其不属于的上下文中添加其他行为)。

有时可以让实体处于不同的有界上下文中,这些上下文指的是同一个逻辑实体,但它们只是为了特定场景的目的而提供该实体的不同视图(例如,在特定的上下文中) )。

这方面的一个很好的例子是电子商务场景。在大多数电子商务应用程序中,您将拥有Order的概念,但没有关于" order"的全局,明确的概念。是。在财务环境中 - 订单只是一张发票。在履行环境中 - 订单只是一个装箱单和一个发送货物的地址。在营销环境中 - 订单代表了客户感兴趣的一小部分情报,可用于未来的目标营销。

有一个贯穿所有这些实体的共性线程,但您可能会看到至少3个单独的Order类,每个类都捕获上下文中的订单的概念

因此,在您的情况下,您有Contract的有界上下文和Budget的有界上下文。在我看来,你现在有另一种方式来看待这些实体,特别是它们彼此互动的方式。这是实体的新视图,可以在其自己的上下文中捕获视图。这个新的上下文可能会有自己的ContractBudget个实体,并且会与上下文和预算上下文重叠,但是那里还会有其他的关系和行为,这些关系和行为不会出现。在其他情境中有意义。

这是一个很难解释的想法:)我前一段时间写了一个类似问题的答案:DDD - How to design associations between different bounded contexts