原文链接:关于Repository模式

定义(来自Martin Fowler的《企业应用架构模式》):

Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.

个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。

tabbycat的理解(来源):

1. Repository模式是架构模式,在设计架构时,才有参考价值;

2. Repository模式主要是封装数据查询和存储逻辑;

3. Repository模式实际用途:更换、升级ORM引擎,不影响业务逻辑;

4. Repository模式能提高测试效率,单元测试时,用Mock对象代替实际的数据库存取,可以成倍地提高测试用例运行速度。

评估:应用Repository模式所带来的好处,远高于实现这个模式所增加的代码。只要项目分层,都应当使用这个模式。

关于泛型Repository接口(来源):

仅使用泛型Repository接口并不太合适,因为Repository接口是提供给Domain层的操作契约,不同的entity对于Domain来说可能有不同的操作约束。因此Repository接口还是应该单独针对每个Eneity类来定义。

泛型的Repository<T>类仍然用来减少重复代码,只是不能被UserRepository类直接继承,因为这样Delete方法将侵入User类,所以改为在UserRepository中 组合一个Repository<T>,将开放给domain可见且又能使用泛型重用的功能委托给这个Repository<T>

Repository与Dal的区别(来源):

Repository是DDD中的概念,强调Repository是受Domain驱动的,Repository中定义的功能要体现Domain的意图和约束,而Dal更纯粹的就是提供数据访问的功能,并不严格受限于Business层。

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

相关英文文章:

  Using Repository and Unit of Work patterns with Entity Framework 4.0

  Implementing Repository Pattern With Entity Framework

  Using the Entity Framework Repository and UnitOfWork Pattern in C# ASP .NET

  Revisiting the Repository and Unit of Work Patterns with Entity Framework

  Do we need to use the Repository pattern when working in ASP.NET MVC with ORM solutions?

  We have IQueryable, so why bother with a repository

  Crazy Talk: Reducing ORM Friction  

推荐代码示例:

  Microsoft - Domain Oriented N-Layered .NET 4.0 App Sample (DDD Architecture)

相关博文:

  EntityFramework之领域驱动设计实践(七)-模型对象的生命周期 - 仓储

  EntityFramework之领域驱动设计实践(八)- 仓储的实现:基本篇

感觉自己确实老了!

最新文章

  1. bzoj1799: [Ahoi2009]self 同类分布
  2. 关于C# WinForm 边框阴影窗体(一)
  3. 如何解决Oracle 11g EM网站报“此网站的安全证书存在问题”
  4. DEDE5.7如何制作网站地图?
  5. HDU 5024 Wang Xifeng&#39;s Little Plot(枚举)
  6. 《NFS文件共享服务的搭建》RHEL
  7. 最受欢迎的5款PHP框架记录,我居然一个不知道。。。
  8. 1.ssh访问限制
  9. bnuoj 1071 拼图++(BFS+康拓展开)
  10. 《C/C++学习指南》 - 关于本书
  11. linux添加静态路由表,重新启动继续有效
  12. 《JS权威指南学习总结--第九章 类和模板》
  13. hibernate系列笔记(2)---Hibernate的核心API
  14. 基于maven的ssm框架整合
  15. 【Python使用】使用pip安装卸载Python包(含离线安装Python包)未完成???
  16. Mysql获取最大自增ID(auto_increment)的五种方式及其特点
  17. ifcfg命令
  18. python3中的urllib.parse的常用方法
  19. C# 循环语句 for
  20. ProgrammingError: You must not use 8-bit bytestrings...

热门文章

  1. form表单和CSS基础
  2. keepalive基础知识
  3. 第一周任务Largest Submatrix of All 1’s
  4. vue computed 源码分析
  5. C语言static和局部变量
  6. mybatis自动生成代码工具(逆向工程)
  7. shell脚本输出九九乘法表
  8. 2019牛客暑期多校训练营(第六场)Palindrome Mouse 回文树+dfs
  9. HTTP状态码(转)
  10. javascript 跨域问题 jsonp