.NetCore学习笔记:二、基于Dapper的泛型Repository

为减少代码量,这里实现一个基于Dapper的泛型Repository。

这里需要引用Dapper.dll和Dapper.Contrib.dll。

接口定义:

1 /// <summary> 2 /// Repository接口 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public interface IRepository<T> where T : class, IEntity 6 { 7     /// <summary> 8     /// 查询 9     /// </summary>10     /// <typeparam name="T"></typeparam>11     /// <param name="sql"></param>12     /// <param name="param"></param>13     /// <param name="commandType"></param>14     /// <returns></returns>15     IEnumerable<T> Query(string sql, object param = null, CommandType? commandType = null);16 17     /// <summary>18     /// 删除行数据19     /// </summary>20     /// <typeparam name="T"></typeparam>21     /// <param name="entity"></param>22     /// <returns></returns>23     bool Delete(T entity);24     /// <summary>25     /// 删除表所有数据26     /// </summary>27     /// <typeparam name="T"></typeparam>28     /// <returns></returns>29     bool DeleteAll();30     /// <summary>31     /// 获取行数据32     /// </summary>33     /// <typeparam name="T"></typeparam>34     /// <param name="id"></param>35     /// <returns></returns>36     T Get(object id);37     /// <summary>38     /// 获取表的所有数据39     /// </summary>40     /// <typeparam name="T"></typeparam>41     /// <returns></returns>42     IEnumerable<T> GetAll();43     /// <summary>44     /// 添加行数据45     /// </summary>46     /// <typeparam name="T"></typeparam>47     /// <param name="entity"></param>48     /// <returns></returns>49     long Insert(T entity);50     /// <summary>51     /// 更新行数据52     /// </summary>53     /// <typeparam name="T"></typeparam>54     /// <param name="entity"></param>55     /// <returns></returns>56     bool Update(T entity);57 58     /// <summary>59     /// 分页方法60     /// </summary>61     /// <param name="sql"></param>62     /// <param name="pageIndex">当前页码</param>63     /// <param name="pageSize">每页显示条数</param>64     /// <param name="param">参数</param>65     /// <param name="transaction"></param>66     /// <param name="commandTimeout"></param>67     /// <returns></returns>68     PagedResult<T> GetPageList(string sql, int pageIndex, int pageSize, object param = null);69 }

接口实现:

1 /// <summary>  2 /// 泛型Repository  3 /// </summary>  4 /// <typeparam name="T"></typeparam>  5 public class Repository<T> : IRepository<T> where T : class, IEntity  6 {  7     private IUnitOfWork _unitOfWork;  8   9     public Repository(IUnitOfWork unitOfWork) 10     { 11         _unitOfWork = unitOfWork;             12     } 13     /// <summary> 14     /// 查询 15     /// </summary> 16     /// <typeparam name="T"></typeparam> 17     /// <param name="sql"></param> 18     /// <param name="param"></param> 19     /// <param name="commandType"></param> 20     /// <returns></returns> 21     public IEnumerable<T> Query(string sql, object param = null, CommandType? commandType = null) 22     { 23         var r = _unitOfWork.DbConnection.Query<T>(sql, param: param, transaction: _unitOfWork.DbTransaction, commandType: commandType); 24         return r; 25     } 26     /// <summary> 27     /// 删除行数据 28     /// </summary> 29     /// <typeparam name="T"></typeparam> 30     /// <param name="entityToDelete"></param> 31     /// <returns></returns> 32     public bool Delete(T entity) 33     { 34         var r = _unitOfWork.DbConnection.Delete<T>(entity, _unitOfWork.DbTransaction); 35         return r; 36     } 37     /// <summary> 38     /// 删除表所有数据 39     /// </summary> 40     /// <typeparam name="T"></typeparam> 41     /// <returns></returns> 42     public bool DeleteAll() 43     { 44         var r = _unitOfWork.DbConnection.DeleteAll<T>(_unitOfWork.DbTransaction); 45         return r; 46     } 47     /// <summary> 48     /// 获取行数据 49     /// </summary> 50     /// <typeparam name="T"></typeparam> 51     /// <param name="id"></param> 52     /// <returns></returns> 53     public T Get(object id) 54     { 55         var r = _unitOfWork.DbConnection.Get<T>(id, _unitOfWork.DbTransaction); 56         return r; 57     } 58     /// <summary> 59     /// 获取表的所有数据 60     /// </summary> 61     /// <typeparam name="T"></typeparam> 62     /// <returns></returns> 63     public IEnumerable<T> GetAll() 64     { 65         var r = _unitOfWork.DbConnection.GetAll<T>(_unitOfWork.DbTransaction); 66         return r; 67     } 68     /// <summary> 69     /// 添加行数据 70     /// </summary> 71     /// <typeparam name="T"></typeparam> 72     /// <param name="entity"></param> 73     /// <returns></returns> 74     public long Insert(T entity) 75     { 76         var r = _unitOfWork.DbConnection.Insert<T>(entity, _unitOfWork.DbTransaction); 77         return r; 78     } 79     /// <summary> 80     /// 更新行数据 81     /// </summary> 82     /// <typeparam name="T"></typeparam> 83     /// <param name="entity"></param> 84     /// <returns></returns> 85     public bool Update(T entity) 86     { 87         var r = _unitOfWork.DbConnection.Update<T>(entity, _unitOfWork.DbTransaction); 88         return r; 89     } 90     /// <summary> 91     /// 分页方法 92     /// </summary> 93     /// <param name="sql"></param> 94     /// <param name="pageIndex">当前页码</param> 95     /// <param name="pageSize">每页显示条数</param> 96     /// <param name="param">参数</param> 97     /// <param name="transaction"></param> 98     /// <param name="commandTimeout"></param> 99     /// <returns></returns>100     public PagedResult<T> GetPageList(string sql, int pageIndex, int pageSize, object param = null)101     {102        var pagingResult =  _unitOfWork.DbConnection.GetPageList<T>(sql, pageIndex, pageSize, param: param, transaction: _unitOfWork.DbTransaction);103         return pagingResult;104     }105 }

GetPageList为Dapper的一个分页扩展:

1 /// <summary> 2 /// 分页方法 3 /// </summary> 4 /// <param name="sql"></param> 5 /// <param name="pageIndex">当前页码</param> 6 /// <param name="pageSize">每页显示条数</param> 7 /// <param name="param">参数</param> 8 /// <param name="transaction"></param> 9 /// <param name="commandTimeout"></param>10 /// <returns></returns>11 public static PagedResult<T> GetPageList<T>(this IDbConnection connection, string sql, int pageIndex, int pageSize, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)12 {13     if (pageIndex < 1) pageIndex = 1;14     if (pageSize < 1) pageSize = 20;15     var startRow = (pageIndex - 1) * pageSize;16 17     //MySql分页18     sql = $"SELECT * FROM ({sql}) tt1  LIMIT {startRow},{pageSize};  SELECT COUNT(1) FROM ({sql}) tt2;";19 20     PagedResult<T> pagingResult = new PagedResult<T>();21     pagingResult.Paged.PageIndex = pageIndex;22     pagingResult.Paged.PageSize = pageSize;23     using (var result = connection.QueryMultiple(sql, param: param, transaction, commandTimeout))24     {25         var list = result.Read<T>();26         var totalCount = result.Read<long>().FirstOrDefault();27         pagingResult.Data = list;28         pagingResult.Paged.TotalRow = totalCount;29     }30     return pagingResult;31 }

PagedResult类:

1 /// <summary> 2 /// 分页模型 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public class PagedResult<T> 6 { 7     public PagedResult() 8     { 9         this.Paged = new Paged();10     }11 12     /// <summary>13     /// 结果14     /// </summary>15     public IEnumerable<T> Data { get; set; }16 17     /// <summary>18     /// 分页数据,包含数据总行数、当前页码、页数据行数和总的分页数19     /// </summary>20     public Paged Paged { get; set; }21 }

Paged类:

1 /// <summary> 2 /// 分页数据 3 /// </summary> 4 public class Paged 5 { 6     /// <summary> 7     /// 当前页码 8     /// </summary> 9     public int PageIndex { get; set; }10     /// <summary>11     /// 页数据行数12     /// </summary>13     public int PageSize { get; set; }14     /// <summary>15     /// 总行数16     /// </summary>17     public long TotalRow { get; set; }18     /// <summary>19     /// 总的分页数20     /// </summary>21     public int TotalPage22     {23         get24         {25             if (this.TotalRow > 0 && this.PageSize > 0)26                 return (int)Math.Ceiling((decimal)this.TotalRow / this.PageSize);27             else28                 return 0;29         }30     }31 }

在IServiceCollection容器中注册:

services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

源码地址:https://github.com/letnet/NetCoreDemo

(0)

相关推荐

  • C#基于接口设计三层架构Unity篇

    一.引言 面向接口(抽象)编程,是为了降低程序的耦合度,符合依赖倒置原则.因此典型的三层架构UI.BLL.DAL基于接口设计后,会拓展成UI.IBLL.BLL.IDAL.DAL.在上一篇<C# ...

  • 应用程序框架实战二十二 : DDD分层架构之仓储(层超类型基础篇)

    前一篇介绍了仓储的基本概念,并谈了我对仓储的一些认识,本文将实现仓储的基本功能. 仓储代表聚合在内存中的集合,所以仓储的接口需要模拟得像一个集合.仓储中有很多操作都是可以通用的,可以把这部分操作抽取到 ...

  • .NetCore学习笔记:三、基于AspectCore的AOP事务管理

    AOP(面向切面编程),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑 ...

  • Angular 服务器端渲染的学习笔记(二)

    官网地址:https://angular.io/guide/universal I have mainly used angular universal for SEO purposes. In th ...

  • 《中医基础理论》学习笔记(二)

    中医学的理论体系 气一元论:"气"在中国哲学史上是一个很重要的范畴,在中医学的学术思想中占有特别重要的地位,是中医学的哲学和医学理论的基石.气是物质实体,是构成宇宙天地以及天地万物 ...

  • .NetCore学习笔记:六、Swagger API接口文档工具

    Swagger一个优秀的Api接口文档生成工具.Swagger可以可以动态生成Api接口文档,有效的降低前后端人员关于Api接口的沟通成本,促进项目高效开发. 1.使用NuGet安装最新的包:Swas ...

  • flask学习笔记(二):文件浏览器+下载指定文件夹中的文件

                                 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 需求 利用flask开一个web-a ...

  • 《脾胃论》元气学习笔记二

    接着昨天的火与元气不两立,继续学习. <脾胃胜衰论>一节,篇幅比较长,需要多读几遍. 里面提到几句话,"脾胃虚则火邪乘之而生大热","劳则气耗,而心火炽动,血 ...

  • 密封油四路备用油源,油从哪来?(学习笔记二)

    接着昨天继续学习双环流密封油系统,昨日学习笔记链接:密封油系统启动时,油从哪来?(学习笔记一),推荐链接发电机双环流密封油系统详解. 今日学习笔记如下: 在密封油泵出口,冷油器前有一路通过备用差压阀来 ...

  • 甲状腺体系化课程--学习笔记二

    在8月30日上线的甲状腺病理学体系化课程,朱教授为我们讲述了甲状腺肿瘤性病变-乳头状癌的诊断标准.诸多亚型和鉴别诊断. 面对这样知识点丰富的课程,除了反复观看之外,我们也要利用学习笔记来加深记忆哦.本 ...

  • 《吴门验方》学习笔记——二加越婢汤

    二加越婢汤 1.组成: 麻 黄9-30g.石 膏30g.生 姜6g . 大枣6g.炙甘草15g.白术30g. 制附子6g .怀牛膝30g.炒杜仲20g. 狗脊15g 2.主治: 萎证(肌肉无力.萎缩. ...