I'm wondering about one issue encountered when implementing reactive Mongo repository in a DDD project which I implement using Java and Spring Boot. Suppose we have such package structure:
/app
|
|------/application
| |
| |------/order
| |
| |------OrderApplicationService.java
|
|------/domain
| |
| |------/order
| |
| |------Order.java
| |------OrderRepository.java
|
|------/infrastructure
|
|------/mongo
|
|------MongoOrderRepository.java
I my OrderRepository.java I want to have a method to save my Order:
public interface OrderRepository {
Order save(Order order);
}
And use it in my application service:
@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());
}
}
Next I want to write MongoOrderRepository which implements OrderRepository. Suppose I will use ReactiveMongoTemplate. The problem is that all its methods return Flux or Mono, so I can't implement my method from OrderRepository interface.
Possible solutions I see are:
- Make 'save' method in OrderRepository return an Order wrapped by Mono. This approach will polute the domain layer with Reactor specific types and break the rule saying that domain layer should be framework code free.
- Develop some sort of wrapping layer, but this will produce some boilerplate code.
- Move OrderService.java to infrastructure layer, but this also breaks some basic DDD concepts.
Does someone see any better solutions?