基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
由于我们有时候需要在基于.net framework的项目上使用(如Winform端应用),有时候有需要在.net core的项目上使用(如.net core的WebAPI),那么我们把基于SQLSugar的基础模块封装,编译为.net standard就很有必要,而且由于.net framework和.net core在配置文件上的差异,我们需要对基础配置信息进行不同环境的兼容处理,以便实现基础模块支持.net FrameWork和.net core的项目调用。
1、基于.netStandard的类库模块
在上篇随笔《
基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中
(1)》中介绍了对SqlSugar 基础模块的封装处理,为了兼容不同类型的框架,我们可以把它们封装为.net Standard类库。
但是 为了基础模块能够顺利加载不同.net框架下的配置文件信息来初始化数据库连接,我们需要配置不同的加载处理方式来读取处理。
如.net Framework的使用App.config中读取配置信息,而.net core项目中使用读取 appSettings.json里面的配置信息。
因此需要让它们兼容,我们需要修改项目文件中的TargetFrameworks,让它根据不同的框架生成不同的DLL类库,从而达到支持不同环境下配置文件的读取处理。
这样我们查看项目属性,就可以看到类库是支持多种目标框架的了。
接下来我们对DbContext辅助类进行改动,让它根据不同的目标框架条件来读取配置信息。
统一入口就是调用ConfigHelper辅助类来隔离处理操作。
publicDbContext()
{this.DbSetting =ConfigHelper.GetDbSettings();
Init(this.DbSetting.DbConfigName);
}public DbContext(stringdbConfigName)
{if (this.DbSetting == null)
{this.DbSetting =ConfigHelper.GetDbSettings();
}
Init(dbConfigName);
}
以替代原先的处理代码。原先的只能从.net framework的App.config中读取,现在我们需要根据框架来判断处理。
publicDbContext()
{//默认采用配置项名//appSettings/DefaultDb 配置项为指定连接字符串的name var dbConfigName = ConfigurationManager.AppSettings["DefaultDb"];
Init(dbConfigName);
}
我们先来定义一个承载数据库信息的实体类对象。
/// <summary> ///数据库配置信息/// </summary> public classDbSetting
{/// <summary> ///默认指定的连接字符串集合的配置项名称/// </summary> public string DbConfigName { get; set; }/// <summary> ///数据库类型,默认为SQLServer/// </summary> public string DbType { get; set; } = "sqlserver";/// <summary> ///连接字符串/// </summary> public string ConnectionString { get; set; }
}
在目标框架为.net framwork的时候,我们的App.Config配置信息是下面的。
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <!--Sqlserver数据库的连接字符串--> <addname="sqlserver"providerName="System.Data.SqlClient"connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI" /> <!--MySQL数据库的连接字符串--> <addname="mysql"providerName="MySql.Data.MySqlClient"connectionString="Server=localhost;Database=winframework;Uid=root;Pwd=123456;SslMode=none" /> <!--sqlite数据库字符串,路径符号|DataDirectory|代表当前运行目录--> <addname="sqlite"providerName="System.Data.SQLite"connectionString="Data Source=|DataDirectory|\WinFramework.db;Version=3;" /> <!--PostgreSQL数据库的连接字符串--> <addname="npgsql"providerName="Npgsql"connectionString="Server=localhost;Port=5432;Database=winframework;User Id=postgres;Password=123456" /> <!--不受驱动影响,32位64位均可使用--> <addname="oracle"providerName="OracleManaged"connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));User ID=win;Password=win" /> <!--达梦数据库的连接字符串--> <addname="Dm"providerName="Dm"connectionString="Server=localhost;User ID=SYSDBA;PWD=SYSDBA;Database=WINFRAMEWORK;" /> </connectionStrings> <appSettings> <!--指定默认的数据库类型,如果不指定则使用第一个连接字符串--> <addkey="DefaultDb"value="sqlserver" /> <!--字典、权限组件的数据库类型:mysql、npgsql、oracle、sqlite、sqlserver等,默认为sqlserver可不写--> <addkey="ComponentDbType"value="sqlserver" /> </appSettings> <startup> <supportedRuntimeversion="v4.0"sku=".NETFramework,Version=v4.8" /> </startup>
而如果是基于.net core的情况下,读取的是appSettings.json里面的配置信息,配置文件信息如下所示。
{"ConnectionStrings": {"Default": "Server=.; Database=WeixinBootstrap2; Trusted_Connection=True;","Oracle": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));User ID=C##ABP;Password=abp","MySql": "Server=localhost;Database=myprojectdb;Uid=root;Pwd=123456;","PostgreSQL": "Server=localhost;Port=5432;Database=myprojectdb;User Id=postgres;Password=123456"},"DbSetting": {"DefaultDb": "Default","ComponentDbType": "sqlserver"},
...........
}
其中 DefaultDb 指向的是默认的连接字符串配置节点名称,而ComponentDbType为它的数据库类型,如sqlserver,mysql这样的标识。
2、根据不同目标框架读取配置信息
有了上面不同目标框架下的配置信息节点的格式,我们就可以根据目标框架的不同来相应读取配置信息,从而实现不同的初始化处理操作。
/// <summary> /// 根据承载环境是netframework或者是.netcore,读取配置信息。 /// 在.netframework中的app.config的appSettings中配置DefaultDb,ComponentDbType,连接字符串在connectionStrings中配置 /// 在.netcore中的appSettings.json的DbSetting节点中配置DefaultDb,ComponentDbType,连接字符串在ConnectionStrings中配置 /// </summary> /// <returns></returns> public static DbSetting GetDbSettings()
{//初始化承载配置信息对象 var dbSetting = newDbSetting();
#ifNETFRAMEWORK//基于.net frameowork下读取app.config的配置 dbSetting.DbType = ConfigurationManager.AppSettings["ComponentDbType"] ?? "sqlserver";
dbSetting.DbConfigName= ConfigurationManager.AppSettings["DefaultDb"];var setting = ConfigurationManager.ConnectionStrings[1];//默认第一个连接字符串 if (!string.IsNullOrWhiteSpace(dbSetting.DbConfigName))
{//如果配置节点名称存在,则读取它的连接字符串 setting =ConfigurationManager.ConnectionStrings[dbSetting.DbConfigName];
}if (setting != null)
{
dbSetting.ConnectionString=setting.ConnectionString;
}
#else //基于.net core下的读取appsettings.json的配置信息 dbSetting.DbType = GetSectionValue("DbSetting:ComponentDbType") ?? "sqlserver";
dbSetting.DbConfigName= GetSectionValue("DbSetting:DefaultDb");var connectionStringKey = string.Format("ConnectionStrings:{0}", dbSetting.DbConfigName);
dbSetting.ConnectionString=GetSectionValue(connectionStringKey);
#endifreturndbSetting;
}
我们可以从类的顶部来选择对应的分类,从而实现代码的加亮显示,便于代码的编写。
另外,我们根据配置信息的数据库类型,通过遍历判断的方式来转换为SqlSugar对应的数据库类型即可。
这样DbContext初始化的时候,就能够顺利适用于不同的目标框架中了,我们在SQLSugar封装的基类就可以不管它的具体处理,只需要初始化DbContext即可,如下代码所示。
基类调用来处理常规的对象返回操作,代码如下所示。
/// <summary> /// 获取所有记录 /// </summary> public virtual async Task<ListResultDto<TEntity>>GetAllAsync()
{var list =await EntityDb.GetListAsync();return new ListResultDto<TEntity>()
{
Items=list
};
}
而如果我们需要联合多表来实现联合查询,也可以使用基类的对象进行处理。
如对于字典来说,根据字典大类名称来获取字典项目信息,而字典项目表里面,只有字典大类的ID,那么就需要联合字典大类和字典项目两个表进行关联查询了,如下代码所示。
/// <summary> ///根据字典类型名称获取所有该类型的字典列表集合(Key为名称,Value为值)/// </summary> /// <param name="dictTypeName">字典类型名称</param> /// <returns></returns> public async Task<Dictionary<string, string>> GetDictByDictType(stringdictTypeName)
{var query = this.dbContent.Client.Queryable<DictDataInfo, DictTypeInfo>(
(d, t)=> d.DictType_ID == t.Id && t.Name ==dictTypeName)
.Select(d=> d); //联合条件获取对象 query= query.OrderBy(d => d.DictType_ID).OrderBy(d => d.Seq);//排序 var list = await query.ToListAsync();//获取列表 var dict = new Dictionary<string, string>();foreach (var info inlist)
{if (!dict.ContainsKey(info.Name))
{
dict.Add(info.Name, info.Value);
}
}returndict;
}
这样就可以实现联合表的查询处理。
至此,我们就可以无差别的在不同的目标框架上,根据不同的配置文件来初始化我们的DbContext类,从而无差别的使用基于SqlSugar的数据库访问处理的基类,简化了框架的处理。
相关随笔列表如下所示。
(本篇随笔)