轻量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,但偶尔也会有人提一些问题,我就知道还有人用的~ 感兴趣的 ...
随机推荐
- js数组方法 改变原数组和不改变原数组的方法整理
改变原数组: pop(): 删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值.如果数组已经为空,则 pop() 不 改变数组,并返回 undefined 值 ...
- require'模块化jquery和angular问题
require 模块化开发问题,正常自己写的模块 是exports 导出一个模块 //模块化引入jquery 不同和问题 require 引入jquery swiper .... 插件和库的时候需要 ...
- world特殊控制符输入
特殊符号的输入表示法. 1,“^l”表示软回车(象这种“↓”). 2,“^p”表示硬回车. 3,“^t”表示制表符. 4,“^m”表示手动分页符. 5,“^+”表示长划线(—). 6,“^=”表示短划 ...
- vs2010开发activex(MFC)控件/ie插件(一)
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50782904 vs2010开发activex(MFC)控件: 第一步:生成ac ...
- Idea工具使用
Idea Project与module的理解 1.基础环境的搭建 1.1.IDEA使用--字体.编码和基本设置 2.插件的安装 2.1.在IDEA中配置Gauge环境 2.2.IdeaVim的安装:: ...
- anroid之异步不如异步
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 使用自定义的CorePoolSize为7的Executor(Executors.newFixedTh ...
- MapReduce优化参数
资源相关参数 //以下参数是在用户自己的 MapReduce 应用程序中配置就可以生效 (1) mapreduce.map.memory.mb: 一个 Map Task 可使用的内存上限(单位:MB) ...
- Linux ->> VMWare Workstation虚拟机里的UBuntu系统安装VMWare-tools
1) mkdir创建一个临时目录 2)复制gz压缩包到临时目录下 3)解压到当前目录 4)运行.pl文件安装 root@ubuntu:/# root@ubuntu:/# cd /tmp/ root@u ...
- 爬虫入门之Scrapy框架基础框架结构及腾讯爬取(十)
Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据. 如果安装了 IPyth ...
- Memory Leak Detection in C++
原文链接:http://www.linuxjournal.com/article/6556?page=0,0 An earlier article [“Memory Leak Detection in ...