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工厂就介绍到此地,下次介绍框架数据层,祝大家生活愉快!

posted on 2016-07-29 08:45  rookey  阅读(1178)  评论(1编辑  收藏  举报

导航