轻量ORM-SqlRepoEx (十一)扩展
以下为 SqlRepoEx.MsSql.ServiceCollection 代码
public static IServiceCollection AddSqlRepo(this IServiceCollection serviceCollection)
{
serviceCollection.AddTransient<IRepositoryFactory, RepositoryFactory>();
serviceCollection.AddTransient<IStatementFactoryProvider, MsSqlStatementFactoryProvider>();
serviceCollection.AddTransient<IEntityMapper, DataReaderEntityMapper>();
serviceCollection.AddTransient<IWritablePropertyMatcher, WritablePropertyMatcher>();
serviceCollection.AddTransient<ISqlLogger, SqlLogger>();
serviceCollection.AddTransient<IStatementExecutor, MsSqlStatementExecutor>();
return serviceCollection;
}
本质上,其处出现的接口及其实现类,其接口的实现类都是可以自定义的
其中,IEntityMapper,IStatementExecutor两个接口去扩展更具有意义。
其他的高级扩展暂时未开放,不作介绍
我们以Dapper的扩展为例,参照实现,扩展自己定制的功能
一、IEntityMapper 实例映射器接口,其功能主要是 将数据提供者IDataReader中的数据,转换到应用程序可用的数据或数据集中
其接口定义为
/// <summary>
/// 实例映射器接口,将IDataReader中的数据转换成TEntity类型实例
/// 用户可以实现自已的映射器,来实现业务中数据与TEntity类之间的转换
/// 默认的映射器为 DataReaderEntityMapper ,SqlRepoEx中还实现了
/// 与Dapper互动的DapperEntityMapper。
/// IEntityMapper必需实现并指定,以供 SqlRepoEx 使用。
/// </summary>
public interface IEntityMapper
{ IEnumerable<TEntity> Map<TEntity>(IDataReader reader) where TEntity : class, new(); List<TEntity> MapList<TEntity>(IDataReader reader) where TEntity : class, new(); TLEntity MapEntityList<TLEntity, T>(IDataReader reader) where TLEntity : List<T>, new() where T : class, new();
}
SqlRepoEx.Adapter.Dapper中的实现
/// <summary>
/// 支持 Dapper 的实例映射器
/// https://github.com/StackExchange/Dapper
/// </summary>
public class DapperEntityMapper : IEntityMapper
{
/// <summary>
/// 从访问关系数据库的数据提供者IDataReader。读取一个或多个正向的结果集流,并将此
/// 数据集映射到DTO列表中。
/// </summary>
/// <typeparam name="TEntity">DTO 类型</typeparam>
/// <param name="reader">访问关系数据库的数据提供者</param>
/// <returns></returns>
public IEnumerable<TEntity> Map<TEntity>(IDataReader reader) where TEntity : class, new()
{
return reader.Parse<TEntity>().ToList();
} /// <summary>
/// 从访问关系数据库的数据提供者IDataReader。读取一个或多个正向的结果集流,并将此
/// 数据集映射到DTO列表中。
/// </summary>
/// <typeparam name="TLEntity">List DTO 类型</typeparam>
/// <typeparam name="T">DTO 类型</typeparam>
/// <param name="reader">访问关系数据库的数据提供者</param>
/// <returns></returns>
public TLEntity MapEntityList<TLEntity, T>(IDataReader reader)
where TLEntity : List<T>, new()
where T : class, new()
{
var list = new TLEntity();
list.AddRange(reader.Parse<T>());
return list;
} /// <summary>
/// 从访问关系数据库的数据提供者IDataReader。读取一个或多个正向的结果集流,并将此
/// 数据集映射到DTO列表中。
/// </summary>
/// <typeparam name="TEntity">DTO 类型</typeparam>
/// <param name="reader">访问关系数据库的数据提供者</param>
/// <returns></returns>
public List<TEntity> MapList<TEntity>(IDataReader reader) where TEntity : class, new()
{
return reader.Parse<TEntity>().ToList();
}
}
二、IStatementExecutor 语句执行器接口,其功能是 SqlRepoEx 执行Sql的各种操作
其接口定义为
/// <summary>
/// SQL语句执行器(必需)。SqlRepoEx需要此接口的实现类来执行Sql语句。
/// 用户可自定义此接口实现类,以达到所需执行效果。
/// </summary>
public interface IStatementExecutor
{
int ExecuteNonQuery(string sql); Task<int> ExecuteNonQueryAsync(string sql); int ExecuteNonQueryStoredProcedure(string name, params ParameterDefinition[] parameterDefinitions); Task<int> ExecuteNonQueryStoredProcedureAsync(string name,
params ParameterDefinition[] parameterDefinitions); IDataReader ExecuteReader(string sql); Task<IDataReader> ExecuteReaderAsync(string sql); IDataReader ExecuteStoredProcedure(string name, params ParameterDefinition[] parametersDefinitions); Task<IDataReader> ExecuteStoredProcedureAsync(string name,
params ParameterDefinition[] parametersDefinitions); IStatementExecutor UseConnectionProvider(IConnectionProvider connectionProvider);
}
SqlRepoEx.Adapter.Dapper中的实现
/// <summary>
/// Dapper语句执行器
/// https://github.com/StackExchange/Dapper
/// </summary>
public class DapperStatementExecutor : IStatementExecutor
{
private IConnectionProvider connectionProvider;
private DbConnection dbConnection; private DynamicParameters TurnParameters(ParameterDefinition[] parameterDefinitions)
{
if (parameterDefinitions == null)
{
return null;
} if (parameterDefinitions.Length == )
{
return null;
} var p = new DynamicParameters();
foreach (var pd in parameterDefinitions)
{
p.Add(pd.Name, pd.Value, pd.DbType, pd.Direction, pd.Size); }
return p;
} /// <summary>
/// Dapper语句执行器构造
/// </summary>
/// <param name="connectionProvider">数据连接提供者</param>
public DapperStatementExecutor(IConnectionProvider connectionProvider)
{
this.connectionProvider = connectionProvider;
this.dbConnection = connectionProvider.GetDbConnection;
}
/// <summary>
/// 执行并返回 ParameterDirection.ReturnValue中的值。
/// </summary>
/// <param name="sql">需要执行的sql</param>
/// <returns></returns>
public int ExecuteNonQuery(string sql)
{
return dbConnection.Execute(sql);
}
/// <summary>
/// 异步执行并返回 ParameterDirection.ReturnValue中的值。
/// </summary>
/// <param name="sql">需要执行的sql</param>
/// <returns></returns>
public Task<int> ExecuteNonQueryAsync(string sql)
{
return dbConnection.ExecuteAsync(sql);
}
/// <summary>
/// 执行指定存储过程,并返回 ParameterDirection.ReturnValue中的值。
/// </summary>
/// <param name="name">存储过程名</param>
/// <param name="parameterDefinitions">存储过程参数列表</param>
/// <returns>返回 ParameterDirection.ReturnValue 中的值</returns>
public int ExecuteNonQueryStoredProcedure(string name, params ParameterDefinition[] parameterDefinitions)
{
var args = TurnParameters(parameterDefinitions); return dbConnection.Execute(name, args, commandType: CommandType.StoredProcedure);
}
/// <summary>
/// 异步执行指定存储过程,并返回 ParameterDirection.ReturnValue中的值。
/// </summary>
/// <param name="name">存储过程名</param>
/// <param name="parameterDefinitions">存储过程参数列表</param>
/// <returns>返回 ParameterDirection.ReturnValue 中的值</returns>
public Task<int> ExecuteNonQueryStoredProcedureAsync(string name, params ParameterDefinition[] parameterDefinitions)
{
var args = TurnParameters(parameterDefinitions); return dbConnection.ExecuteAsync(name, args, commandType: CommandType.StoredProcedure);
}
/// <summary>
/// 执行指定sql,并以IDataReader形式返回。
/// </summary>
/// <param name="sql">需要执行的sql</param>
/// <returns></returns>
public IDataReader ExecuteReader(string sql)
{
return dbConnection.ExecuteReader(sql);
}
/// <summary>
/// 异步执行指定sql,并以IDataReader形式返回。
/// </summary>
/// <param name="sql">需要执行的sql</param>
/// <returns></returns>
public Task<IDataReader> ExecuteReaderAsync(string sql)
{
return dbConnection.ExecuteReaderAsync(sql);
}
/// <summary>
/// 执行指定存储过程,并以IDataReader形式返回。
/// </summary>
/// <param name="name">存储过程名</param>
/// <param name="parametersDefinitions">参数列表</param>
/// <returns></returns>
public IDataReader ExecuteStoredProcedure(string name, params ParameterDefinition[] parametersDefinitions)
{
var args = TurnParameters(parametersDefinitions);
return dbConnection.ExecuteReader(name, args, commandType: CommandType.StoredProcedure);
}
/// <summary>
/// 异步执行指定存储过程,并以IDataReader形式返回。
/// </summary>
/// <param name="name">存储过程名</param>
/// <param name="parametersDefinitions">参数列表</param>
/// <returns></returns>
public Task<IDataReader> ExecuteStoredProcedureAsync(string name, params ParameterDefinition[] parametersDefinitions)
{
var args = TurnParameters(parametersDefinitions); return dbConnection.ExecuteReaderAsync(name, args, commandType: CommandType.StoredProcedure);
}
/// <summary>
/// 指定数据连接提供者
/// </summary>
/// <param name="connectionProvider">数据连接提供者</param>
/// <returns></returns>
public IStatementExecutor UseConnectionProvider(IConnectionProvider connectionProvider)
{
this.connectionProvider = connectionProvider;
return this;
}
}
轻量ORM-SqlRepoEx (十一)扩展的更多相关文章
- SqlSugar轻量ORM
蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSuga ...
- Dapper.NET——轻量ORM
Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...
- Dapper.NET—轻量ORM
Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1 一 ...
- C# Dapper 轻量ORM调试对SQLServer
Dapper简介 Dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快. 使用ORM的好处是增.删.改很快,不用自己写sql,因为这都是重复技 ...
- 轻量ORM-SqlRepoEx介绍
轻量级 ORM-SqlRepoEx 介绍 SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的 ...
- 轻量ORM-SqlRepoEx (九)与Dapper共舞
Dapper就另一个轻量ORM,Dapper及其扩展解决了数据访问端的大部门问题,提供了如数据事务管理.缓存等支持.SqlRepoEx的重点解决了Lambda转换成SQL语句,使SQL使用强类型编写, ...
- 轻量型ORM框架Dapper的使用
在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我 ...
- OWIN轻量型框架介绍
OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请 ...
- Wenaox 一款轻量性能好的微信小程序状态管理库
感慨一下!!! 从开始开发 wenaox 从开始到现在,,时不时更新一下,改一改 bug,却发现已经快 1 年了 orz 虽然很少人用 hhh,但偶尔也会有人提一些问题,我就知道还有人用的~ 感兴趣的 ...
随机推荐
- 解决Openwrt安装插件提示一下错误的办法
解决Openwrt安装插件提示一下错误的办法 Openwrt安装17ce插件,提示一下错误: Collected errors: * check_data_file_clashes: Package ...
- css以前忽略的一些知识点(知识体系搭建)
一.选择器 基本选择器: 通用元素选择器 标签选择器 类选择器 id选择器 组合选择器: 多元素组合选择器 后代元素选择器 子代元素选择器 毗邻元素选择器 属性选择器: [title] & P ...
- 一个简单的JQuery自适应分页插件twbsPagination
下载地址:http://esimakin.github.io/twbs-pagination/ 1 解决totalPages不更新的问题 (先移除然后重新加入DOM树中)在使用twbsPaginati ...
- 远程连接Redis服务器
建立了一个redis服务器,那么其他主机应该怎么连接上呢? /** * * 修改redis.conf配置文件 * */ // 1. 注释掉bind绑定配置 // 2. 搜索并修改为 protected ...
- 车厢调度(train.cpp)
车厢调度(train.cpp) [问题描述] 有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n<=1000) ...
- angular2-HttpClient
@angular/common/http中的HttpClient类,Angular 为应用程序提供了一个简化的 API 来实现 HTTP 功能.它基于浏览器提供的XMLHttpRequest接口. H ...
- 【Udacity】数据的差异性:值域、IQR、方差和标准差
一.值域(Range) Range = Max - Min 受异常值(Outliers)影响 二.四分位差(IQR) 四分位距(interquartile range, IQR),又称四分差.是描述统 ...
- 初学js的穷举思想
初学者,最关机键的,就是掌握for的穷举思想. 穷举:穷尽.完全.全部. 具体方法: 外层:用for循环一一列举所有可能性 内层:用if语句进行判断,如果满足条件就输出,不满足的跳出进行下次循环. & ...
- Django 和 struts 对比
转自:http://www.blogjava.net/shaofan/archive/2007/04/06/109007.html 假设:用两者写一个最小的WEB程序.过程可以参照:1.struts的 ...
- char和varchar的区别
在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类型,一般参考的都是char或者varchar,这两种选择有时候让人很纠结,今天想总结一下它们两者的区别,明确一下两者的 ...