欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

程序员文章站 2022-06-30 18:30:34
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSugar快速实现CRUD 3.3 生成实体类 四. 集成JWT授权验证 五. 实现CORS跨域 六. 集成泛 ......

系列目录

.  创建项目并集成swagger

  1.1 创建

  1.2 完善

二. 搭建项目整体架构

三. 集成轻量级orm框架——sqlsugar

  3.1 搭建环境

  3.2 实战篇:利用sqlsugar快速实现crud

  3.3 生成实体类

四. 集成jwt授权验证

五. 实现cors跨域

六. 集成泛型仓储

 


 源码下载:https://github.com/wangrui321/raypi_v2.0

  1. 根

之前在集成sqlsugar的时候,我们用student类作为例子,写了5个基础的接口:获取集合、获取单个、添加、修改、删除,也就是常说的仓储的crud了。

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

 

service层的代码是这样的:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

 

而且我们规定,以后每个实体类都必须有这个5个基础接口。

所以,当我们再添加一个实体(比如teacher)时,在teacherservice中也要写和studentservice几乎一样的代码(其实就是把代码里所有“student”换成“teacher”就行了)。

这么多重复代码,显然是不符合程序员的审美的。这个时候使用泛型仓储就再适合不过了。

  2. 道

整体思路是,写一个基类“baseservice”,这个基类是一个抽象的泛型类,然后让每个实体的service都继承它。

那么当再新建一个service时,不需要写任何代码,就已经实现了我们需要的那5种基础crud了。

 2.1 iservice层

在iservice层新建一个ibase接口:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用
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);
    }
}
ibase

该接口是个泛型接口,里面集成了对泛型t的5中基础crud操作。

 2.2 service层

在service层新建一个baseservice类:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用
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
    }
}
baseservice

该类为abstract抽象类,只能用来被其他类继承,不能实例化。

然后该类除了之前的获取sqlsugarclient的函数,还了5个集成基础crud操作,不一样的是这里不是传的实体类,而是一个泛型t。

  3. 果

下面,我们写一个teacher的完整的增删改查。

 

先在数据库新建一张教师表:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

 

然后运行项目,调用我们之前写好的自动生成实体类的接口:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

 

生成的实体类是这样的:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

 

在iservice层新建一个iteacher接口:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

跟之前不一样的是,这个接口里不需要再写增删改查的接口了,直接继承ibase,把teacher传过去,就行了。

 

在service层,新建一个teacherservice:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

该service也不要写增删改查,直接继承baseservice就有了。

 

然后bussiness层和控制器层这里就不说了,跟之前一样:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

 

运行调试:

【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用

 这样,不用写任何底层的service,就能实现基础的增删改查了,是不是很爽~