我正在寻找一种编写此代码的好方法:
MyCloudDTO saveInCloud(MyCloudDTO dto) {
//sync http call :-(
return cloudService.save(dto);
}
MyData saveInDb(MyData data) {
//database call
return repository.save(data);
}
MyDTO save(MyDTO dto) {
MyCloudDTO cloudDTO = mapper.map(dto);
dto.setCloudId(saveInCloud(dto).getId());
MyData data = mapper2.map(dto);
dto.setDbId(saveInDb(data).getId());
return dto;
}
使用Spring WebFlux和Monos。
这里的主要问题是,我希望在所有过程中都保留基本dto,因为映射器仅映射他们需要的属性,而其余部分则保留。
我找到了一种方法,但是我不确定这是正确/最佳方法:
Mono<MyCloudDTO> saveInCloud(MyCloudDTO dto) {
return reactiveCloudService.save(dto);
}
Mono<MyData> saveInDb(MyData data) {
return reactiveRepository.save(data);
}
Mono<MyDTO> save(MyDTO dto) {
Mono<MyDTO> baseMono = Mono.just(dto);
Mono<MyCloudDTO> saveCloudMono = Mono.just(dto)
.map(mapper::map)
.flatMap(this::saveInCloud);
Mono<MyDTO> mergeAfterCloudSave = Mono.zip(
baseMono,
saveCloudMono,
(base, cloudDto) -> base.idCloud(cloudDto.getId())); //the setter return this
Mono<MyData> saveDbMono = mergeAfterCloudSave
.map(mapper2::map)
.flatMap(this::saveInCloud);
Mono<MyDTO> mergeAfterDbSave = Mono.zip(
mergeAfterCloudSave,
saveDbMono,
(base, dbData) -> base.idDb(data.getId())); //the setter return this
return mergeAfterDbSave;
}
非常感谢您!
Saveriu