java - DDD Java with Spring - Repository 返回 Mono/Flux

标签 java spring mongodb domain-driven-design project-reactor

我想知道在我使用 Java 和 Spring Boot 实现的 DDD 项目中实现响应式(Reactive) Mongo 存储库时遇到的一个问题。假设我们有这样的包结构:

/app 
  |
  |------/application
  |        | 
  |        |------/order
  |                 |
  |                 |------OrderApplicationService.java
  |
  |------/domain
  |        |
  |        |------/order
  |                 |
  |                 |------Order.java
  |                 |------OrderRepository.java 
  |
  |------/infrastructure
           |
           |------/mongo
                    |
                    |------MongoOrderRepository.java

我的 OrderRepository.java 我想要一个方法来保存我的订单:

public interface OrderRepository {

    Order save(Order order);
}

并在我的应用程序服务中使用它:

@Service
public class OrderApplicationService {

    private final OrderRepository orderRepository;

    public OrderApplicationService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void createOrder() {
        //Dumb order creation
        Order createdOrder = clientRepository.save(new Order());
    }
}

接下来我想编写实现 OrderRepository 的 MongoOrderRepository。假设我将使用 ReactiveMongoTemplate。问题是它的所有方法都返回 Flux 或 Mono,所以我无法从 OrderRepository 接口(interface)实现我的方法。

我看到的可能的解决方案是:

  1. 让 OrderRepository 中的“保存”方法返回一个由 单核细胞增多症。这种方法会用 Reactor 污染域层 特定类型并打破规则说域层应该是 框架代码免费。
  2. 开发某种包装层,但这会产生一些 样板代码。
  3. 将 OrderService.java 移至基础架构层,但这也打破了一些基本的 DDD 概念。

有人看到更好的解决方案吗?

最佳答案

存储库应该与框架代码无关,这是真的,这是一个很好的做法,但你也需要务实,我有一个存储库,我在其中使用了 java lambda,这是一个可以争论的语言级框架。

使用 Flux 或 Mono 有什么好处,将它们作为界面的一部分进行宣传有什么好处?如果没有,您可以将实现细节保留在存储库实现中,并保持接口(interface)没有反应对象。

但是,如果这需要跨越应用层到端口适配器,那么我认为将它们放入存储库的接口(interface)定义中没有任何问题。

话虽如此,您可能想检查另一种方法,使用 CQRS 和六边形架构,您可以两全其美:

  • 为命令(更新和创建部分)提供一个干净的存储库界面
  • 使用查询服务(如果您使用的是 Java,则为普通 POJO,在您的应用程序包中定义)返回查询的 Mono 或 Flux(阅读部分)

    OrderApplicationService.java(这里通过命令创建更新删除) OrderQueryService.java(这里是读取部分)

您的应用程序服务包含对您的 OrderRepository 的引用,查询服务不使用存储库,因为它更直接地查询数据库,例如通过 ReactiveMongoTemplate。

在我的查询服务中,我使用普通的 JDBC 模板,而在存储库实现中使用 Hibernate。

关于java - DDD Java with Spring - Repository 返回 Mono/Flux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56450151/

相关文章:

java - 为什么我的 RCP 应用程序无法检测到已部署的 Flyway/Spring 项目中的迁移文件

java - 如何在文本栏中搜索单词? mysql?

java - 自定义 JFreeChart 标题字体太小

java - 从 java.util.concurrent.Future<T> 到 play.libs.F.Promise<T> : How to do that in Java?

mongodb - 添加文档时是否必须重建MongoDB索引

java - spring注解基础配置

java - 从快照位置下载发布 jar 文件

java - 从不同对象的列表中连接 3 个流时获取 List<String>

php - FOSRestBundle 和 JMS Serializer,获取 JSON 时出错

mongodb - 如何使用 golang 根据用户条件对 mongodb 集合应用多个过滤器