• 轻量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 == 0)
                {
                    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;
            }
        }
  • 相关阅读:
    Spark 1.1.0 安装测试 (分布式 Yarn-cluster模式)
    HBase Mac OSX 安装笔记
    hbase centOS生产环境配置笔记 (1 NameNode, 1 ResourceManager, 3 DataNode)
    ssh 配置自动登录
    CentOS 修改线程数限制等(limits.conf)
    Hadoop Mac OSX 安装笔记
    centos7安装及部署zabbix监控
    设置linux中Tab键的宽度(可永久设置)
    基于NFS共享存储实现KVM虚拟机动态迁移
    KVM虚拟化平台环境部署
  • 原文地址:https://www.cnblogs.com/athinker/p/9796298.html
Copyright © 2020-2023  润新知