以下为 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. pyhton基础

    python是一种什么语言?python是一种动态解释性的强类型定义的语言(1)编程语言分类 编译型: 把源程序的每一条语句都编译成机器语言,并保存成二进制文件, 这样运行时计算机可以直接以机器语言来 ...

  2. 如何去除vue项目中的 # — vue路由的History模式

    前言 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头. 添加 mode: 'history' 之后将使用 HTML5 his ...

  3. (1-3)line-height与图片的表现

    (1-3)line-height与图片的表现 这篇文章真的很重要,耐心看,重中之重. 一.行高和图片的表现 图片和行高有什么歪腻呢?? 很多人不明白,为什么我图片好好的放在一个标签里面它就出现了如下问 ...

  4. [小北De编程手记] : Lesson 03 - Selenium For C# 之 元素定位

    无论哪一种自动化测试的驱动框架(基于B/S,桌面应用,还是手机App).都应当具有一套优秀的元素定位技术.通常的自动化测试流程也可以简单的归结为是一个从被测试程序中识别或是定位元素以及执行操作和验证元 ...

  5. UFW Essentials: Common Firewall Rules and Commands

    Introduction UFW is a firewall configuration tool for iptables that is included with Ubuntu by defau ...

  6. 【转载】javascript深入理解js闭包

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  7. Vue2.0中的系统指令

    v-on注册事件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. 4 关于word2vec的skip-gram模型使用负例采样nce_loss损失函数的源码剖析

    tf.nn.nce_loss是word2vec的skip-gram模型的负例采样方式的函数,下面分析其源代码. 1 上下文代码 loss = tf.reduce_mean( tf.nn.nce_los ...

  9. 面向对象之property

    property功能 以调用数据属性的方式(不用加括号)调用方法 方法定义成数据属性(方法本应该是动词) # 定义property之前 class People: def __init__(self, ...

  10. LeetCode--Combination Sum --ZZ

    http://blog.csdn.net/linhuanmars/article/details/20828631 这个题是一个NP问题,方法仍然是N-Queens中介绍的套路.基本思路是先排好序,然 ...