一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](六)

大家好,我是Rector

又是星期五,很兴奋,很高兴,很high...啦啦啦。。。
Rector在图享网又和大家见面啦!!!上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)》,我们完成了:

AutoMapper是什么简述

安装AutoMapper

AutoMapper的配置

AutoMapper的应用

通过前面几篇文章的学习,本系列【一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]】中主要涉及到的技术和组件已基本介绍到位了。接下来的系列文章主要会以知识技术整合,提升,重构等为中心来展开,通过解决项目实战遇到的各种问题来帮助大家有目,有方向性地学习,以达到提升大家的ASP.NENT MVC 5开发技能的效果。

本文知识要点

今天要给大家分享的是本系列[一步一步创建ASP.NET MVC5程序]的 进阶知识

泛型仓储

为什么使用泛型仓储

说到为什么使用泛型仓储,我们不得不回到我们的项目,以项目设计来驱动,说明为什么是泛型仓储,用泛型仓储有哪些好处。

回到项目本身

在v1.5版本中,我们已经实现了仓储层和服务层。其中,仓储层是我们直接访问数据库的层,可以通过仓储层对数据库进行任何有权限的操作,包括增,删,改,查。我们的PostRepository博文仓储实现类已经实现了其接口中的增,删,改,查操作,IPostRepository接口:

using System.Collections.Generic; using TsBlog.Domain.Entities; namespace TsBlog.Repositories { public interface IPostRepository { /// <summary> /// 根据ID查询单条数据 /// </summary> /// <param>ID</param> /// <returns></returns> Post FindById(int id); /// <summary> /// 查询所有数据(无分页,大数量时请慎用) /// </summary> /// <returns></returns> IEnumerable<Post> FindAll(); /// <summary> /// 写入实体数据 /// </summary> /// <param>博文实体类</param> /// <returns></returns> int Insert(Post entity); /// <summary> /// 更新实体数据 /// </summary> /// <param>博文实体类</param> /// <returns></returns> bool Update(Post entity); /// <summary> /// 根据实体删除一条数据 /// </summary> /// <param>博文实体类</param> /// <returns></returns> bool Delete(Post entity); /// <summary> /// 删除指定ID的数据 /// </summary> /// <param>主键ID</param> /// <returns></returns> bool DeleteById(object id); /// <summary> /// 删除指定ID集合的数据(批量删除) /// </summary> /// <param>主键ID集合</param> /// <returns></returns> bool DeleteByIds(object[] ids); } }

看着这个接口类文件现在想一下,如果我们再在数据库新增一个用户表(User),然后在领域项目【TsBlog.Domain】中对应创建领域实体(User),那么按照本系列以前添加仓储和服务层接口的步骤,我们是不是还需要在仓储中创建一个IUserRepository.cs,如果IUserRepository也包括了增,删,改,查方法,那么我们是不是需要把IPostRepository中的所有接口方法复制到IUserRepository.cs文件中呢?同时,其实现也要同样的复制。

如果我们又添加在数据库新增了多张表,对应的仓储接口和实现是不是又要重复以上的操作呢?ctrl+c , ctrl+v !!! 如果是这样,还不如使用代码生成器来得快。

看到这里,希望有开发经验的开发者们不要笑话。回想一下当初笔者在初入.NET开发的时候也是这么干的,复制,粘贴,代码生成器都用过。随着时间和经验的积累,你也会变得更好,前提是少用或者不用复制,粘贴来实现编码功能,即使是网上找的实现方法,也要自己动手敲一遍。

以上两段话跑题了,我们还是切回正题,上面提到的问题其实是有办法来避免重复工作,减轻我们的工作量的,即使用泛型仓储

泛型仓储的实现

首先,打开项目【TsBlog.Repositories】,创建接口文件 IRepository.cs,在其中编写通用的查询接口方法:

using System; using System.Collections.Generic; using System.Linq.Expressions; namespace TsBlog.Repositories { /// <summary> /// 仓储通用接口类 /// </summary> /// <typeparam>泛型实体类</typeparam> public interface IRepository<T> where T : class, new() { /// <summary> /// 根据主值查询单条数据 /// </summary> /// <param>主键值</param> /// <returns>泛型实体</returns> T FindById(object pkValue); /// <summary> /// 查询所有数据(无分页,请慎用) /// </summary> /// <returns></returns> IEnumerable<T> FindAll(); /// <summary> /// 根据条件查询数据 /// </summary> /// <param>条件表达式树</param> /// <param>排序</param> /// <returns>泛型实体集合</returns> IEnumerable<T> FindListByClause(Expression<Func<T, bool>> predicate, string orderBy); /// <summary> /// 根据条件查询数据 /// </summary> /// <param>条件表达式树</param> /// <returns></returns> T FindByClause(Expression<Func<T, bool>> predicate); /// <summary> /// 写入实体数据 /// </summary> /// <param>实体类</param> /// <returns></returns> long Insert(T entity); /// <summary> /// 更新实体数据 /// </summary> /// <param></param> /// <returns></returns> bool Update(T entity); /// <summary> /// 删除数据 /// </summary> /// <param>实体类</param> /// <returns></returns> bool Delete(T entity); /// <summary> /// 删除数据 /// </summary> /// <param>过滤条件</param> /// <returns></returns> bool Delete(Expression<Func<T, bool>> @where); /// <summary> /// 删除指定ID的数据 /// </summary> /// <param></param> /// <returns></returns> bool DeleteById(object id); /// <summary> /// 删除指定ID集合的数据(批量删除) /// </summary> /// <param></param> /// <returns></returns> bool DeleteByIds(object[] ids); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxwgz.html