知识卡片
资源库用规约替代查找器方法:客户不写查询,只描述条件
内容
资源库协调领域层和数据映射层,对外表现得就像一个内存中的领域对象集合——客户可以像操作普通集合一样往里增加、删除对象,实际的映射代码则在背后按需真正读写数据库。使用资源库时,客户代码先构造一个”条件对象”描述想要什么样的结果(比如criteria.equals(Person.LAST_NAME, "Fowler")加上criteria.like(Person.FIRST_NAME, "M")),再调用repository.matching(criteria)拿到满足条件的领域对象列表——这和直接用查询对象的关键区别在于:用查询对象时,客户代码本质上是在”构建并执行一次查询”;用资源库时,客户代码只是在”描述一个规约(specification),再问资源库有哪些对象符合这个规约”,压根没有”执行查询”这个概念——这看似只是措辞差异,实际上道出了资源库真正的威力:它把”我要什么样的数据”和”这些数据具体怎么被取出来”彻底分开,客户代码自始至终不需要接触SQL,只需要围绕对象和条件写代码。背后实现上,资源库把元数据映射和查询对象结合起来,让条件对象自动转换出对应的SQL,这部分转换到底是查询对象负责合并条件、还是元数据映射自己接管,都是资源库内部的实现细节,不会泄露给客户代码。可迁移启发:为一层复杂的查询能力设计对外接口时,”让调用方只表达意图、不接触执行细节”(规约模式)比”让调用方拼装并触发一次具体操作”(命令式查询)更能彻底切断调用方对底层实现的依赖,这个原则不局限于数据库查询,同样适用于任何”描述要什么”和”怎么拿到”能明确分开的场景。
参考来源
- 位置:《企业应用架构模式》第二部分"模式"之"第13章 对象-关系元数据映射模式"之"13.3 资源库"(源文件:_epub-src/OEBPS/Text/000150.html)
- 结论依据:原文说明"资源库用一个基于规约的对象选择方法来取代基于数据映射器类的特殊的查找器方法……客户代码创建条件,然后把它们传递到资源库,由资源库选择其中和条件匹配的对象。从客户代码的角度说,不存在查询'执行'的概念;但要根据满足查询对象规约的条件来选择适当对象",直接支撑本卡结论。
- 原始内容:这看上去或许只是术语上的差别,但是它阐明了对象与资源库进行交互的好处,这也是其概念威力的一个很大部分。