一直以来想自己做一套开发框架,在其基础上进行快速开发,自从接触微软的MVC框架和Entityframework以来,阅读了大量园子里的相关的技术文章,也进行了不少摸索和尝试,中间经历了多次大刀阔斧的重构,现在总算有了雏形,把权限、模式和界面初步搞定,但是回头一看,依然有很多东西思路不够清晰,很多时候是在生搬硬套,不求甚解,结果搞出来一些四不像的东西。

入行近十年,项目经验和开发经验应当是很丰富的,但是架构方面,确实是个新手,现在总算对相关技术有了一定的了解,因此打算从头再来一遍梳理,彻底的重构。
    之前参考别人的技术文章,加上自己的摸索,大致采用的模式是这样的,使用了MVC和Entityframework,Unity作为IOC容器,Model层和View层不必多说, Controller->Service ->Repository,Repository层通过Entityframework来实现数据的增删改查,业务逻辑放在Service层,通过UnitOfWork模式来实现多实体的事务控制,Controller层的职责就是调度,处理从UI层传过来的参数转换。

首先来说Repository层,首先定义了一个泛型接口,IRepository<Entity>,在里面定义了增删改查,然后定义了一个类 Repository<Entity>,实现IRepository<Entity>接口,同时为了考虑各实体特有的实现,为每个实体定义一个特有接口,以人员为例,定义IUserRepository接口,继承IRepository<User>,最终定义类UserRepository,继承Repository<User>,并实现IUserRepository接口。

所有的实体都是按照上述模式实现的,使用泛型,主要是实现了代码复用,这种模式在园子里也有不少人是这样用的。

关于Repository的定义和作用,园子里有很多文章提过多次了,在此我引用下(来源):

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

由此可见,Repository是从领域驱动设计中的概念,从我的架构设计来说,并不是领域驱动的,没有聚合根的概念,对于Service层来说,需要一个DAL层来处理数据的存储和查询,因此,我这里使用Repository明显是一个误用。

关于Repository与DAL 区别如下:

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

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

这也就意味着,不应当在DAL层单独定义一个IUserRepository类来处理特有的接口方法,如用户不能被删除,而是应当在Service层里做控制,DAL单纯地提供对数据的查询和存储,不关心业务逻辑。

明确了上面的概念,下面就动手进行简化,有两种实现方式,一是使用泛型,二是使用T4模板或者代码生成器,这两种方式都能达到代码复用的目的。我这里采用的泛型,首先定义一个泛型接口IDAO<Entity>,泛型接口中定义方法也很明确:增、删、改、查,此前在IRepository定义了过多的重载方法,例如对于删除,定义了指定主键删除、指定实体删除和指定Lambda表达式删除,对于查询,定义了返回所有实体集合和返回单页数据集合。上述概念明确后,DAL层仅需要提供必要的几个方法即可,而对于同样功能的方法重载,放到Service层更合适。然后定义EFDAO<Entity>类实现该接口。这样做的好处不仅代码实现了复用,而且做到了面向接口编程,对于Service层来说,看到的只是IDAO接口,而不是具体的实现类。而IDAO是怎么实现的,是EntityFramework、NHibernate还是原生的sql,则可以灵活替代,变更数据访问层对整个系统无影响。

简而言之,我的框架实质是MVC模式加三层架构的结合体,View和Controller层基本不动,Model层细分为Model、Service/BLL、DAL三层。

以上是个人的反思和总结,把个人的误用经历、重构原因和最终实现方式发出来,供同道中人参考,欢迎批评指正,期待交流。

转载于:https://www.cnblogs.com/seawaving/p/3999509.html

对Repository模式误用的反思和纠正相关推荐

  1. 分享基于EF6、Unitwork、Autofac的Repository模式设计

    目录 分享基于EF6.Unitwork.Autofac的Repository模式设计 一.实现的思路和结构图 二.Repository设计具体的实现代码 三.Repository设计的具体的使用 四. ...

  2. 分享基于Entity Framework的Repository模式设计(附源码)

    关于Repository模式,在这篇文章中有介绍,Entity Framework返回IEnumerable还是IQueryable? 这篇文章介绍的是使用Entity Framework实现的Rep ...

  3. Repository模式

    近来发现很多ASP.NET MVC的例子中都使用了Repository模式,比如Oxite,ScottGu最近发布的免费的ASP.NET MVC教程都使用了该模式.就简单看了下. 在<企业架构模 ...

  4. Repository模式与UnitOfWorks模式的运用

    软件开发就像是一个江湖,而设计模式就是一本高深的秘籍每读一次.用一次.想一次都能得到新的领悟,让我们的设计技能有所提高.开始时我们可能会"为了模式而模式",让代码变得乱78糟甚至难 ...

  5. 基于NHibernate的UnitOfWork+Repository模式(AutoFac)–Part2

    非常感谢各位在之前comment中提出的意见..确实Razor语法介绍的文章错别字太多,影响大家阅读. 前面的文章介绍了如何在asp.net中中UnitOfWork模式以及Repository模式的使 ...

  6. Repository模式(转载)

    近来发现很多ASP.NET MVC的例子中都使用了Repository模式,比如Oxite,ScottGu最近发布的免费的ASP.NET MVC教程都使用了该模式.就简单看了下. 在<企业架构模 ...

  7. MVC架构中的Repository模式 个人理解

    关于MVC架构中的Repository模式 个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提 ...

  8. MVC+LINQToSQL的Repository模式之(二)数据基类

    namespace Data.TEST {     /// <summary>     /// 数据操作基类     /// </summary>     public abs ...

  9. java repository模式_MVC架构中的Repository模式 个人理解

    个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问.Reposit ...

最新文章

  1. python第三方库中函数调用_Python学习笔记(2)——Python的函数、模块、包和库...
  2. lvs+keepalived实现双实例【双主模型】
  3. 排序算法java 简书_史上最全经典排序算法总结(Java实现)
  4. 记一次笑哭的unterminated string literal报错
  5. SAP UI5里input field live search的实现例子
  6. SAP Spartacus Set Active BaseSite action执行的时间点 - Route路由触发方式
  7. Scala学习(十二)高阶函数
  8. Jmeter Beanshell采样器调用JAVA方法(二)
  9. 类型的权限已失败 SqlClientPermission
  10. c语言程序设计李泽中课后,C语言程序设计李泽中课件第4章解读.ppt
  11. 极简代码(三)—— 向量加法
  12. 第四季-专题7-Linux内核链表
  13. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性
  14. Java思维导图(七)
  15. 单片机c语言出租车计时程序,基于单片机的出租车计费(c语言
  16. [HCIP] 04 - 路由控制之策略路由
  17. 【免费】多种方法手把手教你如何将自己做的网页做成网络链接(直接访问)
  18. [转帖]揭秘太湖之光
  19. 高速充电手机电池问世 充满电只需10秒
  20. 巧用软件下载保存米拍摄影图片的方法

热门文章

  1. 手机短号(hdu2081)
  2. div+css 简单导航
  3. 诗和远方:无题(五十二)- 写给认识的一个老姐的两只猫
  4. 安居客西安房源爬取 + pyecharts 数据展示
  5. 杭州师范大学计算机与科学,杭州师范大学信息科学与工程学院
  6. 在 eclipse 中设置每行的字数
  7. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块...
  8. 如何导出已有的谷歌插件,又如何把导出的插件安装到360浏览器中,又如何对插件小修小改?...
  9. struct 和enum的用法
  10. iOS vuforia 学习钻研(一)