【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用
系列目录
三. 集成轻量级orm框架——sqlsugar
六. 集成泛型仓储
源码下载:https://github.com/wangrui321/raypi_v2.0
1. 根
之前在集成sqlsugar的时候,我们用student类作为例子,写了5个基础的接口:获取集合、获取单个、添加、修改、删除,也就是常说的仓储的crud了。
service层的代码是这样的:
而且我们规定,以后每个实体类都必须有这个5个基础接口。
所以,当我们再添加一个实体(比如teacher)时,在teacherservice中也要写和studentservice几乎一样的代码(其实就是把代码里所有“student”换成“teacher”就行了)。
这么多重复代码,显然是不符合程序员的审美的。这个时候使用泛型仓储就再适合不过了。
2. 道
整体思路是,写一个基类“baseservice”,这个基类是一个抽象的泛型类,然后让每个实体的service都继承它。
那么当再新建一个service时,不需要写任何代码,就已经实现了我们需要的那5种基础crud了。
2.1 iservice层
在iservice层新建一个ibase接口:
using raypi.model; namespace raypi.iservice { public interface ibase<t> where t:class,new() { /// <summary> /// 获取分页列表 /// </summary> /// <param name="pageindex"></param> /// <param name="pagesize"></param> /// <returns></returns> tablemodel<t> getpagelist(int pageindex, int pagesize); /// <summary> /// 获取单个 /// </summary> /// <param name="id"></param> /// <returns></returns> t get(long id); /// <summary> /// 添加 /// </summary> /// <param name="entity"></param> /// <returns></returns> bool add(t entity); /// <summary> /// 编辑 /// </summary> /// <param name="entity"></param> /// <returns></returns> bool update(t entity); /// <summary> /// 批量删除 /// </summary> /// <param name="ids"></param> /// <returns></returns> bool dels(dynamic[] ids); } }
该接口是个泛型接口,里面集成了对泛型t的5中基础crud操作。
2.2 service层
在service层新建一个baseservice类:
using raypi.model; using sqlsugar; using system; using system.collections.generic; using system.linq; using system.linq.expressions; using system.text; namespace raypi.service { /// <summary> /// 服务层基类 /// </summary> /// <typeparam name="t"></typeparam> public abstract class baseservice<t> where t:class,new() { public baseservice() { db = getclient(); sdb = db.getsimpleclient(); } public sqlsugarclient db; public simpleclient sdb; /// <summary> /// 获取客户端 /// </summary> /// <returns></returns> private sqlsugarclient getclient() { sqlsugarclient db = new sqlsugarclient( new connectionconfig() { connectionstring = basedbconfig.connectionstring, dbtype = dbtype.sqlserver, isautocloseconnection = true } ); db.aop.onlogexecuting = (sql, pars) => { console.writeline(sql + "\r\n" + db.utilities.serializeobject(pars.todictionary(it => it.parametername, it => it.value))); console.writeline(); }; return db; } #region crud public tablemodel<t> getpagelist(int pageindex, int pagesize) { pagemodel p = new pagemodel() { pageindex = pageindex, pagesize = pagesize }; expression<func<t, bool>> ex = (it => 1 == 1); list<t> data = sdb.getpagelist(ex, p); var t = new tablemodel<t> { code = 0, count = p.pagecount, data = data, msg = "成功" }; return t; } public t get(long id) { return sdb.getbyid<t>(id); } public bool add(t entity) { return sdb.insert(entity); } public bool update(t entity) { return sdb.update(entity); } public bool dels(dynamic[] ids) { return sdb.deletebyids<t>(ids); } #endregion } }
该类为abstract抽象类,只能用来被其他类继承,不能实例化。
然后该类除了之前的获取sqlsugarclient的函数,还了5个集成基础crud操作,不一样的是这里不是传的实体类,而是一个泛型t。
3. 果
下面,我们写一个teacher的完整的增删改查。
先在数据库新建一张教师表:
然后运行项目,调用我们之前写好的自动生成实体类的接口:
生成的实体类是这样的:
在iservice层新建一个iteacher接口:
跟之前不一样的是,这个接口里不需要再写增删改查的接口了,直接继承ibase,把teacher传过去,就行了。
在service层,新建一个teacherservice:
该service也不要写增删改查,直接继承baseservice就有了。
然后bussiness层和控制器层这里就不说了,跟之前一样:
运行调试:
这样,不用写任何底层的service,就能实现基础的增删改查了,是不是很爽~
上一篇: PS制作一款护肤品海报教程 ps怎么制作护肤品海报
下一篇: js对象拷贝的方法
推荐阅读
-
【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.2 完善
-
【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇
-
【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.2 在框架的基础上利用SqlSugar快速实现CRUD实战篇
-
【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
-
【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
-
【从零开始搭建自己的.NET Core Api框架】(五)由浅入深详解CORS跨域机制并快速实现
-
【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.1 创建
-
【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.1 搭建环境
-
【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用
-
【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.3 自动生成实体类