问题:
假设域包含3个聚合,并对web应用程序执行给定查询字符串的搜索操作。查询字符串必须用于搜索每个聚合中的所有字段,并将每个聚合的3组返回给用户作为结果查询。web应用程序有两个数据存储区:RDBMS和弹性搜索。我们如何将RDBMS+ES基础设施集成到域层?
建议的解决方案:
我能想到的最好的方法是通过在每个域存储库后面隐藏RDBMS+ES基础设施实现来保持对域层的持久性无知。下面是我提出的伪代码格式的解决方案:
AggregateRepository
- jpaAggregateRepository
- elasticAggregateRepository
@Transactional
+ save(Aggregate) {
Denormalize Aggregate to AggregateDocument (because one aggregate can span many tables)
Persist Aggregate to jpaAggregateRepository
Persist AggregateDocument to elasticAggregateRepository
}
+ find() {
Extract PKs from elasticAggregateRepository.find()
return jpaAggregateRepository(PKs)
}
通过这样做,我成功地防止了任何基础结构逻辑污染我的域层。为了最终实现这个用例,我可以在我的应用程序层中执行以下操作:
aggregateOneRepository.find(term)
aggregateTwoRepository.find(term)
aggregateThreeRepository.find(term)
并可能将这3组聚合组合成一个供客户机使用的DTO。
这个溶液脏吗?如果是,请提出更好的解决方案。