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

  • 相关阅读:
    基础总结篇之一:Activity生命周期
    putExtra方法
    fork函数
    linux中fork()函数详解(原创!!实例讲解) (转载)
    系统调用wait、waitpid和exec函数
    版本控制工具VSS使用介绍
    学习进度条六(第七周)
    阶段冲刺4
    阶段冲刺3
    阶段冲刺2
  • 原文地址:https://www.cnblogs.com/rookey/p/5717027.html
Copyright © 2011-2022 走看看