最最简化的实现方式,是代码层面绕过Repository,直接查询DAO,然后转化成VO传给调用方。这样做初看并没有什么卵用,但是结合到具体的业务场景来看,就有用处了,举几个例子:
应用使用了多个数据源,如MySql+ES/opensearch。在分库分表场景下,如果需要查询”所有用户+状态为未开票 的 所有对账单“,直接走MySql是无法查询的,只能使用搜索引擎预先创建的索引,这是一种读写不分离也得分离的情况。
数据源的拓扑结构。MySql的读写分离是透明的,假如要自己造轮子,在应用层面指定写库和读库,并自己提供同步机制,那么此时就可以分别对写库和读库做操作,”强行“读写分离。
保持领域对象和Repository的纯洁性。有很多读操作,都是领域方法和Application层的业务逻辑用不到的,仅仅是提供给外部系统做查询。如果在Repository中加入了大量的查询方法,会增加维护成本。同时,领域对象之间操作时,加载的对象一般是完整的;但是对于外部查询,考虑到领域对象和DB表结构并不完全一致,需要进行定制化的简化和组合,如下图中如果只查商品基础信息,是没必要加载整个领域模型的