我想知道在DDD项目中实现反应性Mongo存储库时遇到的一个问题,我使用Java和Spring Boot实现。假设我们有这样的包结构:
/app
|
|------/application
| |
| |------/order
| |
| |------OrderApplicationService.java
|
|------/domain
| |
| |------/order
| |
| |------Order.java
| |------OrderRepository.java
|
|------/infrastructure
|
|------/mongo
|
|------MongoOrderRepository.java
我需要我的订单存储库。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());
}
}
接下来,我想编写MongoOrderRepository,它实现了OrderRepository。假设我将使用ReactiveMongoTemplate。问题是它的所有方法都返回Flux或Mono,所以我无法从OrderRepository接口实现我的方法。
我认为可能的解决办法是:
有人看到更好的解决方案了吗?
存储库应该对框架代码不可知,这是事实,这是一个很好的实践,但您也需要务实,我在存储库中使用了java lambda,这是语言级别的框架。
使用Flux或Mono的好处是什么?作为界面的一部分宣传它们的好处是什么?如果没有,则可以将实现细节保留在存储库实现中,并使接口没有反应对象。
但是,如果这需要跨越应用程序层到端口适配器,那么我看不出将它们放在存储库的接口定义中有任何问题。
也就是说,您可能希望检查另一种方法,使用CQR和六边形体系结构,您可以实现两个方面的最佳效果:
>
使用查询服务(如果您在java中,则在应用程序包中定义为普通POJO)为查询返回Mono或Flux(阅读部分)
OrderApplicationervice.java(这里是通过命令创建更新删除)OrderQueryService.java(这里是阅读部分)
您的应用程序服务包含对您的OrderRepository的引用,查询服务不使用存储库,因为它更直接地查询数据库,例如通过ReactiveMongoTem板。
例如,在我的查询服务中,我使用普通的JDBC模板,而在存储库实现中使用Hibernate。
我正在尝试使用SpringBoot2.0和新的reactive webFlux库。我想知道如何将通过无阻塞WebClient进行的两个调用的结果返回给我的Springboot API的调用者。我的代码是: 然而,如果我这样称呼它,我得到的回应是 而不是SearchResponse对象的内容。我觉得我可能错过了一个基本的点,这是如何工作的!我的想法是,因为WebClient没有阻塞,所以我可以向we
此示例存储库有一个方法 现在不需要使用Robolectric来单元测试了吗?
我如何传递我的异常,以便使用者将看到我在单声道中传递的原始异常?希望我的问题很清楚,提前谢谢
想象一下,我有一个CourseID对象列表(CourseID,Name)。让我们把这个列表称为'CourseNameList'。 当某人将请求发送到“ 然而,在发送结果之前,我还需要追加每个课程的价格。价格将从另一个微服务中检索,并返回Mono对象。 因此,用户将看到带有(ID、名称、价格)的课程列表。价格来源于其他服务。 控制器方法可能如下所示 我尝试了多种方法来返回Flux。但是,我不知道怎么
我在使用spring-data-neo4j的项目中遇到了一些问题。我有一个节点实体类: 并使用以下方法为其创建存储库: 然后测试,就像这样: > 创建id为123456的广告节点,包含关键字1和关键字2-ok 创建id为654321且包含关键字1的广告节点-确定 获取广告ID 654321-工作正常,生成的查询是: 开始=节点:(={0})返回params{0=654321} 使用findSimi