Domain driven design 构成多个有界上下文的DDD

Domain driven design 构成多个有界上下文的DDD,domain-driven-design,Domain Driven Design,我想听听你对有界上下文集成的建议。 我有一个让我陷入困境的用例: 对于合同管理,我有一个有限的上下文。我可以将当事人(例如各种外部组织)添加到合同中。为各方选择其投资/贡献(例如:总投资的10%)。因此,合同管理有两个方面:一个是行政管理(添加一方,管理多个日期,…),另一个是财务管理(计划他们跨越多年的贡献,检查贡献消耗,…) 我有另一个预算的有界上下文。该环境负责组织层面的费用管理。示例:服务a将具有1000欧元的支出能力。我们可以计划一个预算,然后每个组织党可以消费,购买东西,他们的一部

我想听听你对有界上下文集成的建议。 我有一个让我陷入困境的用例:

  • 对于
    合同
    管理,我有一个有限的上下文。我可以将当事人(例如各种外部组织)添加到合同中。为各方选择其投资/贡献(例如:总投资的10%)。因此,合同管理有两个方面:一个是行政管理(添加一方,管理多个日期,…),另一个是财务管理(计划他们跨越多年的贡献,检查贡献消耗,…)
  • 我有另一个
    预算
    的有界上下文。该环境负责组织层面的费用管理。示例:服务a将具有1000欧元的支出能力。我们可以计划一个预算,然后每个组织党可以消费,购买东西,他们的一部分。为了编制预算,负责企业预算的用户可以直接分配资金或集成年度合同财务组件。当我们将合同部分集成到预算中时,我们冻结了预算中的数据,即我们将货币数据从一个数据库表复制到另一个数据库表中(添加一些审计信息)。我们只有一个数据库
这是我挣扎的最后一部分。每个有界上下文都是一个专用的应用程序。在
budget
应用程序中,合同部分集成到当前预算中后,我需要显示预算明细行。不幸的是,在预算表中,我只有资金数据,而没有关于合同的一些基本信息(对象、参考等)

我在想什么

  • 有时在有界上下文之间复制数据并不坏。我把合同中的钱冻结了。我还可以冻结/复制合同的对象和参考。那么查询将只在
    预算上下文中进行
    。但这里的问题是数据重复。今天我需要对象/参照,如果明天我需要更多字段。。。我需要域事件管理来保持合同/预算之间的数据同步
  • 查询预算,并为每一行查询一个
    合同
    服务,该服务将返回所需的数据。这使每个上下文保持自治,但我需要发出大量数据库请求,以丰富
    预算详细信息行
    对象
  • 在数据库级别只有一个连接,我们就可以实现这一点。这里的耦合呢?这是一个简单的解决方案,也是我们今天正在做的事情(它是一个共享内核吗?)。如果不重新构建预算应用程序,我们似乎无法更改
    合同
    结构。我在上下文之间没有编程契约
我的问题是:

如何构建需要预算上下文中数据的UI屏幕,以及需要合同上下文中数据的每个明细行

旁注:

  • 也许从一开始环境标识和周长就错了(这是一个遗留设计)
  • 我想要的是保持上下文分离(松散耦合)。如果我们可以指定上下文之间的设计契约,那么维护就更容易(或者不容易)
  • 我没有看到如何集成这些上下文(我需要重新读取共享内核、ustream/下游等)

    • 这是一个额外的、独特的有界上下文。它与现有的有界上下文有一些重叠,这很容易使您走上错误的道路(合并上下文或将其他行为放在不属于它的上下文中)

      有时,在不同的有界上下文中有实体是可以的,这些实体引用相同的逻辑实体,但它们只是为了特定场景(例如在特定上下文中)的目的提供了该实体的不同视图

      电子商务场景就是一个很好的例子。在大多数电子商务应用程序中,您将拥有订单的概念,但对于“订单”是什么,没有一个全局的、明确的概念。在财务上下文中-订单只是一张发票。在履行上下文中-订单只是一份装箱单和一个发送货物的地址。在营销环境中-订单代表了一点关于客户感兴趣的信息,可用于未来的目标营销

      所有这些实体都有一个共同点,但您可能会看到至少3个独立的
      Order
      类,每个类都捕获上下文中的顺序概念

      因此,在您的例子中,
      Contract
      有一个有界上下文,而
      Budget
      有一个有界上下文。在我看来,你现在有了另一种看待这些实体的方式,特别是它们相互作用的方式。这是实体的一个新视图,一个可以在其自身上下文中捕获的视图。这个新的上下文可能会有自己的
      合同
      预算
      实体,并且会与上下文和预算上下文重叠,但其中也会有额外的关系和行为,这在其他上下文中是没有意义的


      这是一个很难解释的想法:)我不久前在这里写了一个类似问题的答案:

      这是一个额外的、独特的有界上下文。它与现有的有界上下文有一些重叠,这很容易使您走上错误的道路(合并上下文或将其他行为放在不属于它的上下文中)。我可以问您如何对这个新的第三个上下文建模吗?(将所有域逻辑移到其中并进行查询?)。这一新环境也将以预算为导向。它增加了复杂性。我理解你的评论。我将考虑它,以及这种背景如何出现。在实现DDD时,Vernon谈到了它,但没有提供示例:/I feel n