首页 > 其他分享 >Repository模式【转】

Repository模式【转】

时间:2023-10-13 16:45:34浏览次数:33  
标签:Repository 仓库 数据库 接口 ORM 模式

最近开发的MVC项目使用了Repository模式。

啥是Repository模式?

 



从图看,有一个仓库接口,一个实现了这个仓库接口的基类;然后在使用方,一方面,要声明一个继承于仓库接口的子接口,另一方面,编写一个数据库操作类,继承仓库基类,并实现这个子接口。

继承仓库基类容易理解,为啥还要搞一个子接口呢?直接实现仓库接口不就完啦?思考其中原因,应该是为了控制反转,依赖注入,总之一个类对应一个接口就是了。

Repository模式意义何在呢?

Repository模式是一个中间层,位于 数据库映射层 和 领域层(业务逻辑层)之间。本来嘛,ORM或者DAL已经为我们隔离了数据库,BLL并没有直接访问数据库,如果数据库更换,那改写ORM或DAL即可。那么现在又增加一层Repository,目的何在呢?

摘录一些话,姑妄听之。反正他们牛逼,怎么说都行:

Repository 是一个独立的层,介于领域层与数据映射层 (数据访问层) 之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository 是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。(咦,难道DAL\ORM不是这样的吗?)
Repository 模式是架构模式,在设计架构时,才有参考价值;
Repository 模式主要是封装数据查询和存储逻辑;
Repository 模式实际用途:更换、升级 ORM 引擎,不影响业务逻辑;
Repository 模式能提高测试效率,单元测试时,用 Mock 对象代替实际的数据库存取,可以成倍地提高测试用例运行速度。

这几句话中,好像亮点在于换ORM,比如将NHibernate换成EF,BLL也不受影响。呵呵。

也有一些钻研者自我安慰:
使用Repository,隐含着一种意图倾向,就是 Domain需要什么我才提供什么,不该提供的功能就不要提供,一切都是以Domain的需求为核心;而使用Dal,其意图倾向在于我Dal层能使用的数 据库访问操作提供给Business层,你Business要用哪个自己选。换一个Business也可以用我这个Dal,一切是以我Dal能提供什么操 作为核心。

也有后起之秀顿悟:
仓储模式最大的优点就是所有的数据访问首先是通过仓库的,对仓库的增删改都不会立即提交到数据库,而只有当调用了仓库包裹器,这些增删改的操作才会一次提交到数据库。

但我怎么看,都看不出这个批量提交、仓库包裹器与Repository有什么关系。

今天看到一种隐隐约约的说法,说资源库(大概就是Repository模式吧)有个好处,就是可以兼容缓存。BLL通过资源库来存取数据,而不必知道这些数据是来自于数据库还是缓存。
————————————————
原文链接:http://www.shanhubei.com/archives/2796.html

标签:Repository,仓库,数据库,接口,ORM,模式
From: https://www.cnblogs.com/shanhubei/p/17762494.html

相关文章

  • 简单工厂模式--Java实现+C++实现
    问题描述使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。问题实现用starUML画的相应的类图:然后就是代码实现:Java代码实现在Java里面,Person类相......
  • 单例模式
    如题Java中单例模式的使用有很多方法1.懒汉式,饿汉式,等等用到哪个整理哪个懒汉式饿汉式双检查privatestaticCameraPhotographPresentersInstance;privateCameraPhotographPresenter(){}publicstaticCameraPhotographPresentergetInstance(){if(sInstance=......
  • 计算机视觉与模式识别学术速递[10.13]
    一、检测相关(6篇)1.1UniPose:DetectingAnyKeypointshttps://arxiv.org/abs/2310.08530这项工作提出了一个统一的框架,称为UniPose,以检测任何关节的关键点(例如,人和动物)、刚性和柔软对象,以进行细粒度视觉理解和操纵。关键点是任何对象(尤其是铰接对象)的结构感知、像素级和紧凑表示......
  • Java设计模式-策略模式-基于Spring实现
    1、策略模式1.1、概述策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装在独立的策略类中,使得它们可以相互替换,而不影响客户端代码。这种模式通过将算法的选择从客户端代码中分离出来,提供了更大的灵活性和可维护性。在Java中,策略模式的设计理念可以通过以......
  • 观察者模式
       ......
  • 备忘录模式
      ......
  • 中介者模式
        ......
  • 【RocketMQ】RocketMQ 5.0新特性(二)- Pop消费模式
    Pop模式消费和消息粒度负载均衡在RocketMQ5.0之前,消费有两种方式可以从Broker获取消息,分别为Pull模式和Push模式。Pull模式:消费需要不断的从阻塞队列中获取数据,如果没有数据就等待,这个阻塞队列中的数据由消息拉取线程从Broker拉取消息之后加入的,所以Pull模式下消费需要不断主......
  • 用设计模式优雅干掉 if-else,真香...
    鲁讯曾说:"高端的代码,只需要最朴素的编写方式",简单的业务使用if-else或switchcase,确实直观明了,但是一旦功能复杂,业务流程长了之后,使用传统的if-else或switchcase方式,就会让代码结构变的异常冗余、混乱,过一段时间之后,哪怕是自己写的代码,读起来也会忍不住想喷上几句,这时候,如......
  • Python下划线命名模式
    五种Python下划线模式速查表: 单前导下划线:_var当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。它是对程序员的一个提示-意味着Python社区一致认为它应该是什么意思,但程序的行为不受影响。下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅......