zoukankan      html  css  js  c++  java
  • Rookey.Frame之DAL工厂

          昨天给大家介绍了表单验证功能,今天给大家介绍下Rookey.Frame框架的数据层工厂,由于Rookey.Frame框架ORM是基于servicestack.ormlite,很多朋友反映这个网上中文资料比较少,能不能用dapper或其他的替换掉,答案是肯定的,只在在Rookey.Frame.DALFactory下增加一个工厂类继承抽象工厂DalAbstractFactory,实现相关操作方法即可。

          首先我们来看下DalAbstractFactory的实例化代码

            /// <summary>
            /// 实例化工厂
            /// </summary>
            /// <param name="factoryType">数据工厂类型</param>
            /// <returns></returns>
            public static DalAbstractFactory<T> GetInstance(DatabaseType factoryType)
            {
                switch (factoryType)
                {
                    case DatabaseType.MsSqlServer:
                        {
                            IOrmLiteDialectProvider dialectProvider = SqlServerDialect.Provider;
                            return new OrmLiteDalFactory<T>(dialectProvider);
                        }
                    case DatabaseType.MySql:
                        {
                            IOrmLiteDialectProvider dialectProvider = MySqlDialect.Provider;
                            return new OrmLiteDalFactory<T>(dialectProvider);
                        }
                    case DatabaseType.Oracle:
                        {
                            IOrmLiteDialectProvider dialectProvider = OracleDialect.Provider;
                            return new OrmLiteDalFactory<T>(dialectProvider);
                        }
                    default:
                        {
                            IOrmLiteDialectProvider dialectProvider = SqlServerDialect.Provider;
                            return new OrmLiteDalFactory<T>(dialectProvider);
                        }
                }
            }

        根据数据库类型进行抽象工厂实例化,这样我们很容易对Rookey.Frame的ORM进行替换和改造或增加,如果有更好的ORM可以很方便的接入,对上层项目没有任何影响。

        在抽象工厂中还有两个属性ReadConnectionString、WriteConnectionString,读连接字符串和写连接字符串

            /// <summary>
            /// 读数据库连接串
            /// </summary>
            public string ReadConnectionString
            {
                get
                {
                    return WebConfigHelper.GetConnectionString("DbReadConnString");
                }
            }
    
            /// <summary>
            /// 写数据库连接串
            /// </summary>
            public string WriteConnectionString
            {
                get
                {
                    string connSting = WebConfigHelper.GetConnectionString("DbWriteConnString");
                    if (!string.IsNullOrEmpty(connSting)) return connSting;
                    return ReadConnectionString;
                }
            }

    这两个字符串的读取是根据之前介绍的数据库配置文件来的,在Rookey.Frame框架中基本上每个数据库操作方法都带有string connString = null这个参数,在数据抽象工厂实现层中会优化取用户传入的数据库连接字符串,为空时取配置的数据库连接

    /// <summary>
            /// 获取连接字符串
            /// </summary>
            /// <param name="connString">数据库连接字符串,调用方法是传入的数据库连接字符串</param>
            /// <param name="read">是否读</param>
            /// <returns></returns>
            private string GetConnString(string connString, bool read = true)
            {
                string lastConnStr = !string.IsNullOrEmpty(connString) ? connString : (read ? this.ReadConnectionString : this.WriteConnectionString);
                string modelConfigConnString = GetModelConfigConnString(read); //取模块数据库连接配置
                if (string.IsNullOrEmpty(connString) && !string.IsNullOrEmpty(modelConfigConnString))
                {
                    lastConnStr = modelConfigConnString;
                }
                NotNullCheck.NotEmpty(lastConnStr, "数据库连接字符串");
                return lastConnStr;
            }
            /// <summary>
            /// 获取所有实体集合
            /// </summary>
            /// <param name="references">是否加载导航属性</param>
            /// <param name="connString">数据库连接字符串,调用方法时传入的连接字符串</param>
            /// <returns></returns>
            public override List<T> GetAllEntities(bool references = false, string connString = null)
            {
                string connStr = GetConnString(connString);
                OrmLiteConnectionFactory factory = new OrmLiteConnectionFactory(connStr, _dialectProvider);
                using (var conn = factory.OpenDbConnection())
                {
                    try
                    {
                        SqlExpression<T> exp = conn.From<T>().ThenByDescending("Id");
                        if (references)
                        {
                            exp = exp.Limit(0, 2000);
                        }
                        List<T> list = references ? conn.LoadSelect<T>(exp) : conn.Select<T>(exp);
                        if (list == null) list = new List<T>();
                        return list;
                    }
                    finally
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                }
            }

        对于数据层抽象工厂的其他细节功能请下载最新框架源码了解,今天对DAL工厂就介绍到此地,下次介绍框架数据层,祝大家生活愉快!

  • 相关阅读:
    1105 Spiral Matrix (25 分)螺旋矩阵
    1089 Insert or Merge (25 分)
    1044 Shopping in Mars (25 分)二分查找
    1068 Find More Coins (30 分)记忆化搜索
    1133 Splitting A Linked List (25 分)
    1145 Hashing
    1147 Heaps (30 分)
    1098 Insertion or Heap Sort (25 分)
    自测-3 数组元素循环右移问题 (20 分)
    自测-1 打印沙漏 (20 分)
  • 原文地址:https://www.cnblogs.com/rookey/p/5717027.html
Copyright © 2011-2022 走看看