从一个 BoundedContext/AggregateRoot 获取数据并从另一个 BoundedContext/AggregateRoot 获取一些附加数据的推荐方法?

问题描述 投票:0回答:1

我正在考虑使用 Spring Modulith 构建模块化整体架构,并应用 领域驱动设计 (DDD)。 我有一个关于从多个模块获取数据的问题以及推荐的方法是什么。

首先,这是我的设计方法:

  • 识别多个 BoundedContext 并将它们表示为 Spring Modulith 中的“模块”
  • 使用单个数据库,但每个模块都有单独的模式。每个模块都直接与其自己的数据库模式表对话。
  • 一个模块可以通过调用其他模块的 API 来直接依赖它们。不会出现模块的循环依赖。
  • 每个模块都可以发出事件,其他模块可以使用和处理它们。
  • 模块 A 可以发布模块 B 消费的事件,模块 B 也可以发布模块 A 消费的事件。

从总体上看,这就是我计划实施该应用程序的方式。

假设这是一个电子商务应用程序,有 customerscatalogordersinventory 模块(BoundedContexts)。 有AggregateRoots,例如客户产品订单库存

根据 DDD 建议,AggregateRoot 中仅维护另一个聚合的 ID,而不是对另一个聚合的引用。

//module: customers
class Customer {
    private CustomerId id;
    //other fileds
}

//module: orders
class Order {
    private OrderId id;
    private CustomerId customerId;
    //other fileds
}

现在的问题是如何构建一个读取模型来显示订单列表以及一些基本的客户详细信息(姓名、电子邮件、电话)。

以下是我能想到的几种方法:

1。查询并合并数据:

  • 从订单模块中的OrderService获取最近订单列表
  • 提取这些订单的所有 customerId,并从“客户”模块中的 CustomerService 获取这些 customerId 的客户详细信息。
  • 合并订单和客户数据并准备 OrderDTO 列表。

优点:

  • 实现相对简单,无需引入CQRS,存储数据的重复副本。

缺点:

  • 我们正在创建方法来满足其他模块的需求。对于当前的用例,我们只需要客户的非常基本的详细信息。 对于不同模块的其他用例,我们可能需要客户的更多详细信息。 我们可以实现获取客户详细信息的所有这些变体,或者实现一种返回所有客户详细信息的方法。 这两种选择对我来说似乎都不是最佳选择。

2。使用 CQRS:

  • 每当创建/更新订单时,请使用 CQRS 并存储订单详细信息的聚合视图。
  • 从读取的数据库/视图中获取订单详细信息,其中包含订单和客户信息。

优点:

  • 针对 READ 操作进行了优化。

缺点:

  • 实现事件处理程序和存储聚合数据的额外开销。

如果我们可能需要显示主要来自一个 BoundedContext/AggregateRoot 的数据以及来自不同 BoundedContext/AggregateRoot 的一些附加数据,那么您推荐的实现用例的方法是什么?

spring-boot architecture domain-driven-design cqrs spring-modulith
1个回答
0
投票

订阅 Customer 模块中的 OrderCreated 消息,并将订单中所需的数据导入到 Customer schema 中。这种方法避免了不同团队的耦合

© www.soinside.com 2019 - 2024. All rights reserved.