以下为 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. python中的not,and, or

    not 表示  非,and 表示 与 ,or 表示 或 ,他们的优先级 not > and > or  在python中 都是从左到右去判断条件的,例如and ,True and True ...

  2. Jupyter 常用快捷键 及 常用方法笔记

      两个不同的cell有上下的关系, 不是完全独立的, 下图可以看出下面的res是引用上面的   保存节点        就像虚拟机的快照与恢复 回到节点 保存文件 s(快捷键)        实际写 ...

  3. GreenDao 初体验

    GreenDao 使用 环境搭建(android studio) project的build.gradle buildscript { repositories { google() jcenter( ...

  4. Jmeter CSV 参数化/检查点/断言

    当参数的值没有规律且量不太大时,可以使用CSV Data set config这种方法. 案例: 应用Sogou自动搜索关键字: 软件开发测试,web功能自动化测试,性能自动化测试,Selenium以 ...

  5. Http重要知识点

  6. webpack2-webpack.config.js配置

     写在前面: 了解更多:https://github.com/miaowwwww/webpack-learn 贴一个webpack.ocnfig.js 的配置属性表 一.代码分割: 1.插件 Comm ...

  7. 精通Groovy

    https://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html https://juejin.im/entry/ ...

  8. JDBC URL格式定制

    数据库URL制定: 当加载的驱动程序,可以建立程序中使用DriverManager.getConnection()方法的连接.为方便参考,让列出了三个重载DriverManager.getConnec ...

  9. Php 性能参数优化 及 Iptables 防火墙限制用户访问平率

    Php-Fpm.Conf 文件配置优化 [global] pid = run/php-fpm.pid process_control_timeout=5 [www] listen.allowed_cl ...

  10. 前后端分离, 前端如何防止直接输入URL进入页面?

    转自:https://blog.csdn.net/weixin_41829196/article/details/80444870 前后端分离,如何防止用户直接在地址栏输入url进入页面,也就是判断用 ...