经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
轻量ORM-SqlRepoEx (十一)扩展
来源:cnblogs  作者:a.thinker  时间:2018/10/18 9:08:04  对本文有异议

以下为 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中的数据,转换到应用程序可用的数据或数据集中

 其接口定义为

 

  1. /// <summary>
  2. /// 实例映射器接口,将IDataReader中的数据转换成TEntity类型实例
  3. /// 用户可以实现自已的映射器,来实现业务中数据与TEntity类之间的转换
  4. /// 默认的映射器为 DataReaderEntityMapper ,SqlRepoEx中还实现了
  5. /// 与Dapper互动的DapperEntityMapper。
  6. /// IEntityMapper必需实现并指定,以供 SqlRepoEx 使用。
  7. /// </summary>
  8. public interface IEntityMapper
  9. {
  10. IEnumerable<TEntity> Map<TEntity>(IDataReader reader) where TEntity : class, new();
  11. List<TEntity> MapList<TEntity>(IDataReader reader) where TEntity : class, new();
  12. TLEntity MapEntityList<TLEntity, T>(IDataReader reader) where TLEntity : List<T>, new() where T : class, new();
  13. }

 

SqlRepoEx.Adapter.Dapper中的实现

 

  1. /// <summary>
  2. /// 支持 Dapper 的实例映射器
  3. /// https://github.com/StackExchange/Dapper
  4. /// </summary>
  5. public class DapperEntityMapper : IEntityMapper
  6. {
  7. /// <summary>
  8. /// 从访问关系数据库的数据提供者IDataReader。读取一个或多个正向的结果集流,并将此
  9. /// 数据集映射到DTO列表中。
  10. /// </summary>
  11. /// <typeparam name="TEntity">DTO 类型</typeparam>
  12. /// <param name="reader">访问关系数据库的数据提供者</param>
  13. /// <returns></returns>
  14. public IEnumerable<TEntity> Map<TEntity>(IDataReader reader) where TEntity : class, new()
  15. {
  16. return reader.Parse<TEntity>().ToList();
  17. }
  18. /// <summary>
  19. /// 从访问关系数据库的数据提供者IDataReader。读取一个或多个正向的结果集流,并将此
  20. /// 数据集映射到DTO列表中。
  21. /// </summary>
  22. /// <typeparam name="TLEntity">List DTO 类型</typeparam>
  23. /// <typeparam name="T">DTO 类型</typeparam>
  24. /// <param name="reader">访问关系数据库的数据提供者</param>
  25. /// <returns></returns>
  26. public TLEntity MapEntityList<TLEntity, T>(IDataReader reader)
  27. where TLEntity : List<T>, new()
  28. where T : class, new()
  29. {
  30. var list = new TLEntity();
  31. list.AddRange(reader.Parse<T>());
  32. return list;
  33. }
  34. /// <summary>
  35. /// 从访问关系数据库的数据提供者IDataReader。读取一个或多个正向的结果集流,并将此
  36. /// 数据集映射到DTO列表中。
  37. /// </summary>
  38. /// <typeparam name="TEntity">DTO 类型</typeparam>
  39. /// <param name="reader">访问关系数据库的数据提供者</param>
  40. /// <returns></returns>
  41. public List<TEntity> MapList<TEntity>(IDataReader reader) where TEntity : class, new()
  42. {
  43. return reader.Parse<TEntity>().ToList();
  44. }
  45. }

 

 二、IStatementExecutor 语句执行器接口,其功能是 SqlRepoEx 执行Sql的各种操作

 

其接口定义为

 

  1. /// <summary>
  2. /// SQL语句执行器(必需)。SqlRepoEx需要此接口的实现类来执行Sql语句。
  3. /// 用户可自定义此接口实现类,以达到所需执行效果。
  4. /// </summary>
  5. public interface IStatementExecutor
  6. {
  7. int ExecuteNonQuery(string sql);
  8. Task<int> ExecuteNonQueryAsync(string sql);
  9. int ExecuteNonQueryStoredProcedure(string name, params ParameterDefinition[] parameterDefinitions);
  10. Task<int> ExecuteNonQueryStoredProcedureAsync(string name,
  11. params ParameterDefinition[] parameterDefinitions);
  12. IDataReader ExecuteReader(string sql);
  13. Task<IDataReader> ExecuteReaderAsync(string sql);
  14. IDataReader ExecuteStoredProcedure(string name, params ParameterDefinition[] parametersDefinitions);
  15. Task<IDataReader> ExecuteStoredProcedureAsync(string name,
  16. params ParameterDefinition[] parametersDefinitions);
  17. IStatementExecutor UseConnectionProvider(IConnectionProvider connectionProvider);
  18. }

 

SqlRepoEx.Adapter.Dapper中的实现

 

  1. /// <summary>
  2. /// Dapper语句执行器
  3. /// https://github.com/StackExchange/Dapper
  4. /// </summary>
  5. public class DapperStatementExecutor : IStatementExecutor
  6. {
  7. private IConnectionProvider connectionProvider;
  8. private DbConnection dbConnection;
  9. private DynamicParameters TurnParameters(ParameterDefinition[] parameterDefinitions)
  10. {
  11. if (parameterDefinitions == null)
  12. {
  13. return null;
  14. }
  15. if (parameterDefinitions.Length == 0)
  16. {
  17. return null;
  18. }
  19. var p = new DynamicParameters();
  20. foreach (var pd in parameterDefinitions)
  21. {
  22. p.Add(pd.Name, pd.Value, pd.DbType, pd.Direction, pd.Size);
  23. }
  24. return p;
  25. }
  26. /// <summary>
  27. /// Dapper语句执行器构造
  28. /// </summary>
  29. /// <param name="connectionProvider">数据连接提供者</param>
  30. public DapperStatementExecutor(IConnectionProvider connectionProvider)
  31. {
  32. this.connectionProvider = connectionProvider;
  33. this.dbConnection = connectionProvider.GetDbConnection;
  34. }
  35. /// <summary>
  36. /// 执行并返回 ParameterDirection.ReturnValue中的值。
  37. /// </summary>
  38. /// <param name="sql">需要执行的sql</param>
  39. /// <returns></returns>
  40. public int ExecuteNonQuery(string sql)
  41. {
  42. return dbConnection.Execute(sql);
  43. }
  44. /// <summary>
  45. /// 异步执行并返回 ParameterDirection.ReturnValue中的值。
  46. /// </summary>
  47. /// <param name="sql">需要执行的sql</param>
  48. /// <returns></returns>
  49. public Task<int> ExecuteNonQueryAsync(string sql)
  50. {
  51. return dbConnection.ExecuteAsync(sql);
  52. }
  53. /// <summary>
  54. /// 执行指定存储过程,并返回 ParameterDirection.ReturnValue中的值。
  55. /// </summary>
  56. /// <param name="name">存储过程名</param>
  57. /// <param name="parameterDefinitions">存储过程参数列表</param>
  58. /// <returns>返回 ParameterDirection.ReturnValue 中的值</returns>
  59. public int ExecuteNonQueryStoredProcedure(string name, params ParameterDefinition[] parameterDefinitions)
  60. {
  61. var args = TurnParameters(parameterDefinitions);
  62. return dbConnection.Execute(name, args, commandType: CommandType.StoredProcedure);
  63. }
  64. /// <summary>
  65. /// 异步执行指定存储过程,并返回 ParameterDirection.ReturnValue中的值。
  66. /// </summary>
  67. /// <param name="name">存储过程名</param>
  68. /// <param name="parameterDefinitions">存储过程参数列表</param>
  69. /// <returns>返回 ParameterDirection.ReturnValue 中的值</returns>
  70. public Task<int> ExecuteNonQueryStoredProcedureAsync(string name, params ParameterDefinition[] parameterDefinitions)
  71. {
  72. var args = TurnParameters(parameterDefinitions);
  73. return dbConnection.ExecuteAsync(name, args, commandType: CommandType.StoredProcedure);
  74. }
  75. /// <summary>
  76. /// 执行指定sql,并以IDataReader形式返回。
  77. /// </summary>
  78. /// <param name="sql">需要执行的sql</param>
  79. /// <returns></returns>
  80. public IDataReader ExecuteReader(string sql)
  81. {
  82. return dbConnection.ExecuteReader(sql);
  83. }
  84. /// <summary>
  85. /// 异步执行指定sql,并以IDataReader形式返回。
  86. /// </summary>
  87. /// <param name="sql">需要执行的sql</param>
  88. /// <returns></returns>
  89. public Task<IDataReader> ExecuteReaderAsync(string sql)
  90. {
  91. return dbConnection.ExecuteReaderAsync(sql);
  92. }
  93. /// <summary>
  94. /// 执行指定存储过程,并以IDataReader形式返回。
  95. /// </summary>
  96. /// <param name="name">存储过程名</param>
  97. /// <param name="parametersDefinitions">参数列表</param>
  98. /// <returns></returns>
  99. public IDataReader ExecuteStoredProcedure(string name, params ParameterDefinition[] parametersDefinitions)
  100. {
  101. var args = TurnParameters(parametersDefinitions);
  102. return dbConnection.ExecuteReader(name, args, commandType: CommandType.StoredProcedure);
  103. }
  104. /// <summary>
  105. /// 异步执行指定存储过程,并以IDataReader形式返回。
  106. /// </summary>
  107. /// <param name="name">存储过程名</param>
  108. /// <param name="parametersDefinitions">参数列表</param>
  109. /// <returns></returns>
  110. public Task<IDataReader> ExecuteStoredProcedureAsync(string name, params ParameterDefinition[] parametersDefinitions)
  111. {
  112. var args = TurnParameters(parametersDefinitions);
  113. return dbConnection.ExecuteReaderAsync(name, args, commandType: CommandType.StoredProcedure);
  114. }
  115. /// <summary>
  116. /// 指定数据连接提供者
  117. /// </summary>
  118. /// <param name="connectionProvider">数据连接提供者</param>
  119. /// <returns></returns>
  120. public IStatementExecutor UseConnectionProvider(IConnectionProvider connectionProvider)
  121. {
  122. this.connectionProvider = connectionProvider;
  123. return this;
  124. }
  125. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号