以下为 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 (十一)扩展的更多相关文章

  1. SqlSugar轻量ORM

      蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSuga ...

  2. Dapper.NET——轻量ORM

    Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...

  3. Dapper.NET—轻量ORM

    Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一 ...

  4. C# Dapper 轻量ORM调试对SQLServer

    Dapper简介 Dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快. 使用ORM的好处是增.删.改很快,不用自己写sql,因为这都是重复技 ...

  5. 轻量ORM-SqlRepoEx介绍

    轻量级 ORM-SqlRepoEx 介绍 SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的 ...

  6. 轻量ORM-SqlRepoEx (九)与Dapper共舞

    Dapper就另一个轻量ORM,Dapper及其扩展解决了数据访问端的大部门问题,提供了如数据事务管理.缓存等支持.SqlRepoEx的重点解决了Lambda转换成SQL语句,使SQL使用强类型编写, ...

  7. 轻量型ORM框架Dapper的使用

    在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我 ...

  8. OWIN轻量型框架介绍

    OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请 ...

  9. Wenaox 一款轻量性能好的微信小程序状态管理库

    感慨一下!!! 从开始开发 wenaox 从开始到现在,,时不时更新一下,改一改 bug,却发现已经快 1 年了 orz 虽然很少人用 hhh,但偶尔也会有人提一些问题,我就知道还有人用的~ 感兴趣的 ...

随机推荐

  1. Algorithm——最长公共前缀

    一.问题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow ...

  2. css以前忽略的一些知识点(知识体系搭建)

    一.选择器 基本选择器: 通用元素选择器 标签选择器 类选择器 id选择器 组合选择器: 多元素组合选择器 后代元素选择器 子代元素选择器 毗邻元素选择器 属性选择器: [title] & P ...

  3. DOM节点常见的属性及操作

    (1)常见节点属性 childNodes      子节点 nodeList children      子节点(元素节点) HTMLCollection parentNode       父节点 p ...

  4. 你必须知道的get与post的真正区别

    我们会经常看到有人问:http协议中GET请求和POST请求有什么区别~? 这个问题看似很简单,但是不同程度的人会回答出不同的结果.在公司的面试中,也会经常的问及类似这样的问题,看似很简单,但是不同层 ...

  5. 移动端Hybird的网络层优化策略

    一.前端代码策略:域名切换(多域名部署),解决DNS缓存及域名劫持 二.客户端策略 客户端在空闲时ping cdn节点域名列表中的域名,测量延时.丢包等数据.如果延迟 > xxx,丢包 > ...

  6. 基础架构之Docker私有库

    由于项目要容器化,所有搭建自己的镜像库也是很有必要的,不然发到直接使用官方的镜像库,速度绝对能让你头疼,这篇文章就介绍搭建自己的镜像私有库. (一)  环境要求 Centos 7.5.1804 Doc ...

  7. c++ inline 的位置不当导致的 无法解析的外部符号

    这几天编写代码碰到 无法解析的外部符号 visual studio. 在类中 inline 修饰符应该放在类函数定义的时候而不是声明的地方 即 // test.h 头文件 class A { publ ...

  8. Android学习——ListView的缓存机制

    在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间. ListView的使用 ListView和V ...

  9. 修改虚拟机ip备份

    修改虚拟机ip 因为别人写的很好,在此备份一下.

  10. LeetCode-Largest Rectangle in Histogram O(n) 详析-ZZ

    http://www.cnblogs.com/felixfang/p/3676193.html Largest Rectangle in Histogram Given n non-negative ...