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