【发布时间】:2019-10-20 08:29:38
【问题描述】:
我想知道在我使用 Java 和 Spring Boot 实现的 DDD 项目中实现反应式 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 接口实现我的方法。
我看到的可能解决方案是:
- 使 OrderRepository 中的“保存”方法返回一个被包裹的订单 单核细胞增多症。这种方法将使用 Reactor 污染域层 特定类型并打破规则说领域层应该是 框架代码免费。
- 开发某种包裹层,但这会产生一些 样板代码。
- 将 OrderService.java 移至基础设施层,但这也打破了一些基本的 DDD 概念。
有人看到更好的解决方案吗?
【问题讨论】:
-
标准更好的解决方案是使用 Spring Data 而根本不编写存储库实现。
-
为什么要使用 ReactiveMongoTemplate?你可以去MongoTemplate。问题是如果你选择 ReactiveMongoTemplate,你完整的项目代码应该以响应的方式编写,否则没有使用它的意义。
-
是的,在这个项目中我最终会使用 MongoTemplate。我只是想知道反应式回购如何与经典的 DDD 概念集成并收集一些关于此的观点。感谢您的回复。
标签: java spring mongodb domain-driven-design project-reactor