资源库是什么?
不要去定义资源库是什么,而是要去明白资源库能干什么。
资源库(repository)的作用是存储领域模型数据,实现领域模型与具体存储底层的解耦。
当实体、值对象、领域事件这些领域对象被创建出来之后,数据是被临时存储到内存之中的,但是计算机的内存是不可能无限大的,当实体、值对象、领域事件这些领域对象数量过大的时候,就会产生OOM,而使整个系统崩溃。再者,假使计算机的内存足够容纳这大量的领域对象,但是一量计算机发生重启的时候,这些领域对象都被会摧毁。因此,领域对象必须要有持久化的能力。
试想一下,为啥DDD不使用实体直接操作DAO持久化呢?而非要搞出资源库这么一个中间抽象呢?
资源库是一个抽象,抽象适合放在领域层之中,可以被实体、值对象、领域事件、领域服务等领域层组件强耦合。而资源库的具体实现,可以是操作数据库的DAO、可以是操作Redis的Redission客户端、也可以是操作云盘的OSS-SDK。
资源库使得领域层与存储层得以解耦,使领域层更加稳定,更加符合现实物理世界。
为什么需要资源库?
资源库,是属于战术模式,是偏技术的设计工具,主要是给开发人员使用,而不是给业务人员使用的。
虽然如此,但还是有很多开发者觉得资源库不实用,不如直接使用DAO来得直接。他们之所以有这样子的想法,是因为,他们在使用DDD时把数据库层放入到了领域层,他们把实体当作PO来映射数据库模型,他们的做法根本就不是在践行DDD,而是只打着DDD的名义,让自己的项目看上去高大尚些而已。
以下对话,可以让你更加明白什么是资源库,为什么需要资源库。
业务:XXX,XXX功能现在的响应速度太慢了,打开一个页面平均需要10多秒,这严重影响到了我们的业绩,必须要在一周内给我们解决!
技术:一周时间,太短了吧!XXX功能现在是使用MYSQL数据库,现在数据量太大了,需要把数据切到NoSQL数据库才行。可是我们的代码,都是在实体、领域服务中直接操作DAO的,换成NoSQL的话,改动量太大了!
业务:……我不管,谁叫你们在开发系统的时候技术方案没设计好。……最多给你们两周时间!不能再多了!
这种时候,想一下,如果当时在写代码时使用了资源库,那么,需要改动的代码就非常少了,只需要修改资源库的具体实现即可!
在国内的很多大公司里面,因为受到政治因素的影响,很多欧美的产品都是被受到限制的,企业为了将政治因素的负面影响降到最低,在大范围地去除欧美的产品,使用自主可控的,或者开源的产品来替代,比如去除Oracle改用MySql!
然而,开源的产品,真的是可以一直使用吗?目前事实已经证明,开源终有一天是闭源!
众所周知,美国对华为发起了国家级别的制裁,迫使华为内部大量地去除美国的产品,凡是Oracle数据库的都要替换成MySql,但过了一段时间后,发现MySql也不安全,MySql也最终要替换成自主研发的数据库。
如果你的领域层代码强耦合了存储底层实现,那么,那么在面对这种版权风险的时候就会苍白无力。
而资源库,能将你替换底层存储实现的风险与成本降到最低。
举一反三,资源库的这种设计思想,还能用在更多的地方!
以下是资源库使用的一些示例代码
注意的是,示例代码中,资源库的定义放在domain层,实现放在infrastructure层中。