NetCore+Dapper WebApi架构搭建(二):底层封装
看下我们上一节搭建的架构,现在开始从事底层的封装
1、首先需要一个实体的接口IEntity
namespace Dinner.Dapper
{
public interface IEntity<TPrimaryKey>
{
TPrimaryKey Id { get; set; }
}
}
2、由于所有的数据库实体都是有主键的,所以这里定义一个BaseModel,这里我用的主键是Guid,你们可以换成int
using System; namespace Dinner.Dapper
{
public class BaseModel : IEntity<Guid>
{
public Guid Id { get; set; }
}
}
3、接下来是封装Dapper的SqlServer配置DataBaseConfig(Redis的配置你们可以忽略),不要忘记添加Dapper的Nuget包
using StackExchange.Redis;
using System.Data;
using System.Data.SqlClient; namespace Dinner.Dapper
{
public class DataBaseConfig
{
#region SqlServer链接配置 private static string DefaultSqlConnectionString = @"Data Source=localhost;Initial Catalog=Dinner;User ID=sa;Password=123456;";
private static string DefaultRedisString = "localhost, abortConnect=false";
private static ConnectionMultiplexer redis; public static IDbConnection GetSqlConnection(string sqlConnectionString = null)
{
if (string.IsNullOrWhiteSpace(sqlConnectionString))
{
sqlConnectionString = DefaultSqlConnectionString;
}
IDbConnection conn = new SqlConnection(sqlConnectionString);
conn.Open();
return conn;
} #endregion #region Redis链接配置 private static ConnectionMultiplexer GetRedis(string redisString = null)
{
if (string.IsNullOrWhiteSpace(redisString))
{
redisString = DefaultRedisString;
}
if (redis == null || redis.IsConnected)
{
redis = ConnectionMultiplexer.Connect(redisString);
}
return redis;
} #endregion
}
}
4、然后是仓储基接口IRepositoryBase,添加了基本的增删改查和一个无参的存储过程
using System;
using System.Collections.Generic;
using System.Threading.Tasks; namespace Dinner.Dapper
{
public interface IRepositoryBase<T>
{
Task Insert(T entity, string insertSql); Task Update(T entity, string updateSql); Task Delete(Guid Id, string deleteSql); Task<List<T>> Select(string selectSql); Task<T> Detail(Guid Id, string detailSql); /// <summary>
/// 无参存储过程
/// </summary>
/// <param name="SPName"></param>
/// <param name="args"></param>
/// <returns></returns>
Task<List<T>> ExecQuerySP(string SPName);
}
}
5、仓储基实现类RepositoryBase继承仓储基接口,简单实现增删改查和无参的存储过程
using Dapper;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks; namespace Dinner.Dapper
{
public class RepositoryBase<T> : IRepositoryBase<T>
{
public async Task Delete(Guid Id, string deleteSql)
{
using (IDbConnection conn = DataBaseConfig.GetSqlConnection())
{
await conn.ExecuteAsync(deleteSql, new { Id = Id });
}
} public async Task<T> Detail(Guid Id, string detailSql)
{
using (IDbConnection conn = DataBaseConfig.GetSqlConnection())
{
//string querySql = @"SELECT Id, UserName, Password, Gender, Birthday, CreateDate, IsDelete FROM dbo.Users WHERE Id=@Id";
return await conn.QueryFirstOrDefaultAsync<T>(detailSql, new { Id = Id });
}
} /// <summary>
/// 无参存储过程
/// </summary>
/// <param name="SPName"></param>
/// <returns></returns>
public async Task<List<T>> ExecQuerySP(string SPName)
{
using (IDbConnection conn = DataBaseConfig.GetSqlConnection())
{
return await Task.Run(() => conn.Query<T>(SPName, null, null, true, null, CommandType.StoredProcedure).ToList());
}
} public async Task Insert(T entity, string insertSql)
{
using (IDbConnection conn = DataBaseConfig.GetSqlConnection())
{
await conn.ExecuteAsync(insertSql, entity);
}
} public async Task<List<T>> Select(string selectSql)
{
using (IDbConnection conn = DataBaseConfig.GetSqlConnection())
{
//string selectSql = @"SELECT Id, UserName, Password, Gender, Birthday, CreateDate, IsDelete FROM dbo.Users";
return await Task.Run(()=>conn.Query<T>(selectSql).ToList());
}
} public async Task Update(T entity, string updateSql)
{
using (IDbConnection conn = DataBaseConfig.GetSqlConnection())
{
await conn.ExecuteAsync(updateSql, entity);
}
}
}
}
上面这些就是底层基本的封装,下一节我们来添加实体和仓储
源码地址: https://github.com/wangyulong0505/Dinner
NetCore+Dapper WebApi架构搭建(二):底层封装的更多相关文章
- NetCore+Dapper WebApi架构搭建(一):基本框架
初衷是想用dapper搭建一个高性能的架构,因为dapper操作数据库的效率很高 1.VS创建一个NetCore WebApi的框架,然后解决方案添加一个NetStandard的类库 整个解决方案如图 ...
- NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入
上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入 在NetCore WebApi项目中新添加一个文件夹(Unit),当然你也 ...
- NetCore+Dapper WebApi架构搭建(三):添加实体和仓储
上一节讲了类库添加一些底层的基本封装,下面来添加实体和仓储 1.Entities文件夹添加一个实体类Users,继承BaseModel,即拥有BaseModel的主键 using System; na ...
- NetCore+Dapper WebApi架构搭建(六):添加JWT认证
WebApi必须保证安全,现在来添加JWT认证 1.打开appsettings.json添加JWT认证的配置信息 2.在项目根目录下新建一个Models文件夹,添加一个JwtSettings.cs的实 ...
- NetCore+Dapper WebApi架构搭建(五):Swagger构建WebApi界面
上一节讲解了仓储的依赖注入,想必现在都可以通过构造函数依赖注入直接调用 但是WebApi只是提供一个接口调用,为了方便我们的操作,我们得给他加上一个图形化界面工具,使用Swagger WebApi项目 ...
- 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步
深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
- .Net Framework下对Dapper二次封装迁移到.Net Core2.0遇到的问题以及对Dapper的封装介绍
今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和大家分享一下.下面我会还原迁移的每一个过程 ...
- NetCore Dapper封装
一.前期环境准备 1.创建一个core webapi的项目,基于core3.1版本创建一个项目. 2.Dapper安装,使用NuGet来安装Dapper程序包 Install-Package Dapp ...
- Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装
前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装. Dapper的用法比较接近ADO.NET所以性能也是比较快.所以我们先来看看使用A ...
随机推荐
- HDU 1027 Ignatius and the Princess II 排列生成
解题报告:1-n这n个数,有n!中不同的排列,将这n!个数列按照字典序排序,输出第m个数列. 第一次TLE了,没注意到题目上的n和m的范围,n的范围是小于1000的,然后m的范围是小于10000的,很 ...
- css 实现圆形头像
1.方法一 直接设置img为圆形,这种情况下如果图片不是正方形,图片会被拉伸 <img class="circleImg" src="../img/photo/im ...
- ORA-00906 missing left parenthesis括号
Oracle 建表报错:ORA-00906 missing left parenthesis括号 建表语句:create table test(id char,name varchar(1),s ...
- python函数,模块及eclipse配置python开发环境
一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...
- vue项目中遇到的一些问题
或访问:https://github.com/littleHiuman/experiences-about-vue 欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...
- go语言项目汇总
Horst Rutter edited this page 7 days ago · 529 revisions Indexes and search engines These sites prov ...
- Scrapy命令行工具简介
Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 在最初使用Scrapy时,使用编辑器或IDE手动编写模块来创建爬虫(Spide ...
- python网络编程--线程GIL(全局解释器锁)
一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...
- java基础48 IO流技术(序列流)
本文知识点目录: 1.SequenceInputStream序列流的步骤 2.实例 3.附录(音乐的切割与合并) 1.SequenceInputStream序列流的步骤 1.找到目标文件 ...
- shell中的特殊符号总结
在shell中常用的特殊符号罗列如下: # ; ;; . , / \\ 'string'| ! $ ${} $? $$ $* \"string\"* ** ...