我想请教一个问题,这个问题与在使用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中的“save”方法返回一个包装在Mono中的Order。这种方法会用Reactor特定类型污染领域层,并打破领域层应该没有框架代码的规则。
- 开发某种包装层,但这将产生一些样板代码。
- 将OrderService.java移动到基础架构层,但这也违反了一些基本的DDD概念。