老师,想请教一下接口设计的问题
来源:1-8 【经验分享群讨论】如何快速涨薪,在中小厂成为Leader?

大晴子点
2021-07-09
是这样,就是目前我们有个分析服务要重新改造,原来用的是es提供聚合查询服务的,但是呢,架构师希望这个是可配置的,根据现场客户需要什么提供什么去查询,比如可以换成Mongodb,或者mysql。
- 这几天了看了些spring data 文档,关于Repository的介绍, 那其实下层可以根据想要的数据源实现好自己的Repository,比如JPA的,ES的,Mongodb的Repository;这个具体实现即可,没啥好说的;那这一块感觉可以作为一个Starter,就像spring-boot-starter一样,提供给上层服务使用;
- 基于上面,这个starter,那比如对User表进行聚合查询操作,那肯定已经有了JpaRepository 和 EsRepository对应的 实现了,那必然定义2个User ,因为User这个domain需要特定的注解,比如JPA的User要打上 @Entity,Es的User要打上@Document,如下图所示,肯定要分开的,不可能用一个User,同时打上2个注解的。
- 然后我这个分析服务,引用了这个Starter,在service 层 我正式对User这个表 进行一些想要的聚合查询操作,那首先,我肯定会定义一个抽象的接口,假设是BaseRespository,然后我再定义2个实现,一个是EsRespositoryImpl,一个是MongodbRespositoryImpl 去实现这个接口,实现类中再注入对应的上面Starter提供的对应的 Respository,并且实现类打上 @ConditionalOnExpression 和@Component 这个注解,在application.properties中会定义一个配置,决定使用什么数据源做聚合查询,这样一旦配置好,我再Service层只要注入 BaseRespository 即可,就能知道用哪个数据源去查询了;
- 老师,基于上面,有个地方就是搞不定,就是我比如对User表去查询,动态选择数据源实现解决了,
但是我Service 这层如何接受返回的数据呢,它可能返回的是EsRespository使用的User,有可能是jpa的,有可能是mongodb的; 还有就是你 Service 这层去查询的时候,肯定要指定查询的表吧,那我怎么引入呢,引入谁的,现在又有Mongo的,又有es的,或者是mysql的,虽然User 表的字段都一样,下层应该是一个泛型,那这层肯定要给一个具体的,所以Service 这层,传递实体和接受返回的数据,怎么转换,进行统一处理呢,没想明白,麻烦老师看下,谢谢!
写回答
1回答
-
求老仙
2021-07-29
看下你实际业务需要的接口设计。
00
相似问题