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

系列目录

一.  创建项目并集成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了。

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);
    }
}

IBase

该接口是个泛型接口,里面集成了对泛型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
    }
}

BaseService

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

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

3. 果

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

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

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

生成的实体类是这样的:

在IService层新建一个ITeacher接口:

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

在Service层,新建一个TeacherService:

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

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

运行调试:

没有写任何底层的Service,基础的增删改查就完成了。

原文地址:https://www.cnblogs.com/RayWang/p/9498591.html

时间: 2024-08-23 21:10:35

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

【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.1 创建

既然说了是从零开始,那就从最基本的新建项目开始吧~ 新建一个ASP.NET Core Web应用程序,取名为RayPI. 这里选择API模板 生成项目之后,控制器默认生成了一个ValuesController,里面只有几个简单的RESTful风格的接口,分别对应增删改查的功能,没有涉及到数据库数据,只是给我们作为参考而已. 我们可以直接F5进入调试运行状态,结果是这样的: 到这,一个最基础.最原生的"光秃秃"的.NET Core API环境已经搭建好了,但是离我们想要的API框架还很远

【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

本来打算将搭建项目架构和集成SqlSugar放在一起讲的,但是感觉东西有点多,还是分成两章吧~ 这一章讲搭建项目的整体架构,这里先把搭建完成后的最终效果放出来,然后再逐个解释每层的作用. 可以看到这里一共有七层,源码在最下面,需要的可以参考源码进行对比(下面我按照自顶层向底层的顺序介绍,所以列出的顺序和图片有点区别) (一)RayPI主项目层 我在控制器文件夹下添加了两个文件夹,Admin和Client,分别用来存放后台和前端的接口. 这么做主要有两个理由,一个是我觉得这样可以把后台和前台的功能

【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.1 搭建环境

首先,需要向项目引入SqlSugar,方法有两种: 1)直接使用Nuget导包 2)Github下载源码,然后项目引用 这里选择了第二种. 引入成功后,我们需要先按照自己的习惯配置一下环境,比如数据库连接字符串怎么放,怎么方便的利用SqlSugar进行CRUD. 先看数据库连接字符串,我将它放到了BaseDBConfig.cs,如图: (有人习惯把它放到系统配置文件里,.NET Core环境下取消了web.config机制,配置统一采用json文件进行存储,关于利用json读写配置信息后面拿出一

从零开始搭建自己的前后端分离【 .NET Core2.0 Api + Vue 2.0 】框架之二 || 后端项目搭建

WHY 至于为什么要搭建.Net Core 平台,这个网上的解释以及铺天盖地,想了想,还是感觉重要的一点,跨平台,嗯!没错,而且比.Net 更容易搭建,速度也更快,所有的包均有Nuget提供,不再像以前的单纯引入组件,比如是这样的: 已经没有了之前的Assemblies和COM的引入,初次使用感觉会很别扭,不过使用多了,发现还是很方便的,所以你一定要会使用Nuget,真的很强大,这点儿设计思路感觉更像Linux了. HOW 说了从零开始,就得从零开始,老生常谈,开始. 当然,前提是你得安装.Ne

.NET Core API后台架构搭建

ASP.NET Core API后台架构搭建 项目文件:https://files.cnblogs.com/files/ZM191018/WebAPI.zip 本篇可以了解到: 依赖注入 Dapper ORM框架 第一步:目录文件构建 新建两个类库: 添加好之后,文件构建如下: 第二步:下载Oracle.ManagerDataAccess.Core.Dapper程序包. 第三步:开发DB connection l  新建接口IConnectionProvider.IDbContext.IDbCo

从零开始搭建android框架系列(转)

网址:从零开始搭建android框架系列 githup:https://github.com/CameloeAnthony/Ant

【原创】从零开始搭建Electron+Vue+Webpack项目框架(五)预加载和Electron自动更新

导航: (一)Electron跑起来(二)从零搭建Vue全家桶+webpack项目框架(三)Electron+Vue+Webpack,联合调试整个项目(四)Electron配置润色(五)预加载及自动更新(六)构建.发布整个项目(包括client和web)(未完待续) 摘要:到目前为止,我们的项目已经具备了PC客户端该有的一些基础功能和调试环境,但是总感觉缺了灵魂,那就是结合实际项目.实际业务的细节处理,缺着吧...这篇文章就介绍一下预加载和自动更新,文字功底有限,如有介绍的不清楚的地方,欢迎留言

《从零开始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

原创文章,欢迎转载.转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销并不意味着内存什么都不用管.Swift类型内存管理是采用ARC,Foundation类型和Core Foundation类型内存管理都是采用MRC或ARC,CoreFoundation类型内存管理是基于C语言风格的,它有一个对象所有权的概念. Objective-C的MRC内存管理 Core Fou

【原创】从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(二)

导航: (一)Electron跑起来(二)从零搭建Vue全家桶+webpack项目框架(三)Electron+Vue+Webpack,联合调试整个项目(未完待续)(四)Electron配置润色(未完待续)(五)预加载及自动更新(未完待续)(六)构建.发布整个项目(包括client和web)(未完待续) 摘要:上篇文章说到了如何新建工程,并启动一个最简单的Electron应用.“跑起来”了Electron,那就接着把Vue“跑起来”吧.有一点需要说明的是,webpack是贯穿这个系列始终的,我也是