正文
在项目开发当中,经常会出现某个类的属性或几个属性是另外一个类的查询条件,无论是数据库查询还是rpc调用,需要显式手动拼接,并且由于使用范围不同,只会取某些类,随着项目的迭代,这往往会导致代码中混乱调用,以及业务中有众多相似代码,但如果统一在一起加载,例如使用聚合根的思想,又会造成某些不需要的类加载,造成读放发大。 本节介绍
model-view-builder
框架,来解决上述问题。
model-view-builder
github地址:
https://github.com/PhantomThief/model-view-builder
,这是一个能力非常强大的框架,其使用函数式编程定义加载动作,树状结构关联加载类,懒加载延时构建。
函数式编排
SimpleModelBuilder builder = new SimpleModelBuilder()
.self(TaskInfo.class, TaskInfo::getTaskId)
.on(TaskInfo.class).id(TaskInfo::getTaskId).to(Decision.class)
.on(TaskInfo.class).id(TaskInfo::getTaskId).to(Disposal.class)
.on(TaskInfo.class).id(TaskInfo::getTaskId).to(RiskControl.class)
.on(TaskInfo.class).id(TaskInfo::getPoiId).to(DeepInfo.class)
.on(TaskInfo.class).id(TaskInfo::getPoiId).to(PoiInfo.class)
.build(Decision.class, decisionDao::getDecisionMap)
.build(Disposal.class, disposalDao::getDisposalMap)
.build(RiskControl.class, riskControlDao::getRiskControlMap)
.build(DeepInfo.class, deepInfoDao::getDeepInfoMap)
.build(PoiInfo.class, poiInfoDao::getPoiInfoMap);
树状结构关联
懒加载构建
builder = new SimpleModelBuilder()
.self(A.class, A::getId)
.lazyBuild(A.class,
(BuildContext context, Collection ids)
-> BService.get(ids),
B.class)
buildContext.get(B.class)
其中lazyBuild是懒加载,只有在读取的时候会调用;重复获取数据的时候也不会重复调用,可以避免读放大。
该框架使用多层Map维护类与函数,
以及类与类之间的映射关系,使其具有编排、聚合的能力
,这些能力天然就适合领域划分,通过领域划分确定边界作为上下文信息,在方法中传递使用,提高代码可读性的同时,也
为研发人员提供高效获取数据的体验。
业务示例描述:有这么一个需求,先查询帖子,再查询评论,最后查询是否是粉丝。
构建modelBuilder
构建与读取结果
框架缺点同样也很明显:
在考虑引入该框架的时候,需要考虑以上缺点在团队中是否成问题,如果没问题,可放心使用,你大概率会成为它的重度用户。