看下我们上一节搭建的架构,现在开始从事底层的封装

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架构搭建(二):底层封装的更多相关文章

  1. NetCore+Dapper WebApi架构搭建(一):基本框架

    初衷是想用dapper搭建一个高性能的架构,因为dapper操作数据库的效率很高 1.VS创建一个NetCore WebApi的框架,然后解决方案添加一个NetStandard的类库 整个解决方案如图 ...

  2. NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入

    上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入 在NetCore WebApi项目中新添加一个文件夹(Unit),当然你也 ...

  3. NetCore+Dapper WebApi架构搭建(三):添加实体和仓储

    上一节讲了类库添加一些底层的基本封装,下面来添加实体和仓储 1.Entities文件夹添加一个实体类Users,继承BaseModel,即拥有BaseModel的主键 using System; na ...

  4. NetCore+Dapper WebApi架构搭建(六):添加JWT认证

    WebApi必须保证安全,现在来添加JWT认证 1.打开appsettings.json添加JWT认证的配置信息 2.在项目根目录下新建一个Models文件夹,添加一个JwtSettings.cs的实 ...

  5. NetCore+Dapper WebApi架构搭建(五):Swagger构建WebApi界面

    上一节讲解了仓储的依赖注入,想必现在都可以通过构造函数依赖注入直接调用 但是WebApi只是提供一个接口调用,为了方便我们的操作,我们得给他加上一个图形化界面工具,使用Swagger WebApi项目 ...

  6. 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步

    深入理解MVC   MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...

  7. .Net Framework下对Dapper二次封装迁移到.Net Core2.0遇到的问题以及对Dapper的封装介绍

    今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和大家分享一下.下面我会还原迁移的每一个过程 ...

  8. NetCore Dapper封装

    一.前期环境准备 1.创建一个core webapi的项目,基于core3.1版本创建一个项目. 2.Dapper安装,使用NuGet来安装Dapper程序包 Install-Package Dapp ...

  9. Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装

    前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装. Dapper的用法比较接近ADO.NET所以性能也是比较快.所以我们先来看看使用A ...

随机推荐

  1. JS事件用法

    1.常用事件理解

  2. 当遇到not a dynamic executable时怎么做

    当我使用ldd查找Drcom所缺少的32为库的时候提示not a dynamic executable 最后网上找到答案 来自http://forum.ubuntu.org.cn/viewtopic. ...

  3. linux nginx大量TIME_WAIT的解决办法--转

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 8535 CLOSE_WAIT 5 FIN ...

  4. 解决Win7&Win8 64位下Source Insight提示未完整安装的问题[转]

    转自:http://www.cnblogs.com/sixiweb/p/3421533.html 网上的破解版的注册表文件都是针对32位系统的,所以在64位系统里运行根本无法破解.下面分别贴出这俩系统 ...

  5. Codechef AMXOR

    Problem Codechef Solution 我们可以按位进行考虑,如果一个 \(m_i\) 在某一位上为1,但 \(x_i\) 却取了0,那么我们就称它脱离了限制,更低位可以随便乱填.也就是说 ...

  6. grpc 实现微服务生态笔记

    微服务的发展可谓是一波三折,一代一代经历和N多技术成果,grpc只是其中一个,因为其东家是google,明显比较稳定.加上其强大的文档和技术支持和跨平台的支持,在企业级应用上有很大的可信任感,所以也有 ...

  7. PHP的数据库连接mysqli遍历示例

    $mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间,以秒为单位的连接超时时间 $m ...

  8. 2->集群架构主机优化流程

    集群架构优化流程: 有道笔记分享链接

  9. mysql数据库查找类型不匹配

    无意中看到10级学长的博客,提到了mysql数据库类型查找不匹配的问题,博客地址是:卢俊达 . 数据库中建表中会对每个属性进行类型划分,然后在查找数据库select时: MySQL 的文档 (Type ...

  10. javascript数组元素的添加、删除与插入以及参数数组的使用

    1.数组元素的添加 push方法在数组的尾部添加元素: var colorArray=new Array(); colorArray.push('red','black','yellow'); //这 ...