【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用
系列目录
一. 创建项目并集成swagger
三. 集成轻量级ORM框架——SqlSugar
六. 集成泛型仓储
源码下载:https://github.com/WangRui321/RayPI_V2.0
注:以下项目里的Service层其实是DAL层的意思,以前都习惯写DAL的,经园友回复提醒,Service一般指业务逻辑层,用Service确实不准确,下个版本更新会更正一下~
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 => == );
List<T> data = sdb.GetPageList(ex, p);
var t = new TableModel<T>
{
Code = ,
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层和控制器层这里就不说了,跟之前一样:
运行调试:
这样,不用写任何底层仓储,就能实现基础的增删改查了,是不是很爽~
【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用的更多相关文章
- 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.1 创建
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.1 搭建环境
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(五)由浅入深详解CORS跨域机制并快速实现
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 从零开始搭建自己的.NET Core Api框架-1目录
https://www.cnblogs.com/RayWang/p/9216820.html 系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. ...
- net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作
系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 哈哈哈哈,大家好,我就是那个高产似母猪的三合,长久以来,我一直在思考,如何才能实现高效而简洁的仓储模式 ...
- 从零开始搭建django前后端分离项目 系列六(实战之聚类分析)
项目需求 本项目从impala获取到的数据为用户地理位置数据,每小时的数据量大概在8000万条,数据格式如下: 公司要求对这些用户按照聚集程度进行划分,将300米范围内用户数大于200的用户划分为一个 ...
随机推荐
- 解决exlipse下 springboot 错误:找不到或无法加载主类
简单描述:控制台出现了下图 废话不多说,直接上解决办法: 方法一:如果你很有自信,自己的pom 没问题,并且已经加载了所有依赖的jar.ok,这是eclipse的问题,window=>prefe ...
- CentOS7.6最小化纯净版安装xfce桌面
安装Xfce桌面环境 yum groupinstall "X Window system" yum install epel-release yum groupinstall xf ...
- Jenkins编辑或替换All view
为什么我不能编辑“All”view? 这是因为它的类型是“All”而不是“List”,并且“All”类型是不可编辑的.你只能有一个“All”类型的view. 如果你想编辑这个View,你将不得不创建一 ...
- postgresql 53300错误
1.查看当前库的最大连接数 show max_connections; 2.查看当前数据库的活动连接数 select datname,application_name,pid,state from p ...
- Nginx 如何设置反向代理 多服务器,配置区分开来,单独文件保存单个服务器 server 主机名配置,通过 include 实现
samcao 关注 2015.06.15 10:08* 字数 0 阅读 408评论 0喜欢 0 网络结构如上图.可能你只有一个公网的Ip地址. 但是您的内网有个网站需要映射至外网.而又不想添加其它 ...
- Xpath Helper的使用
xPath Helper插件 xPath helper是一款Chrome浏览器的开发者插件,安装了xPath helper后就能轻松获取HTML元素的xPath,程序员就再也不需要通过搜索html源代 ...
- Windows键盘钩子
Runtime:VS2013 #include "stdafx.h" #include <windows.h> #include <conio.h> DWO ...
- UOJ#129. 【NOI2015】寿司晚宴 动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ129.html 题解 考虑把大于等于 $\sqrt n$ 的质数和小于 $\sqrt n$ 的分开考虑: 1. 小于等于 ...
- mapreduce项目中加入combiner
combiner相当于是一个本地的reduce,它的存在是为了减少网络的负担,在本地先进行一次计算再叫计算结果提交给reduce进行二次处理. 现在的流程为: 对于combiner我们有这些理解: M ...
- 002 html总结
1.题目 每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗? div+css的布局较table布局有什么优点? strong与em的异同? 你能描述一下渐进增强和优雅降级之 ...