using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace Admin.Core.Common { public class BaseDBConfig { /* * 多库操作,默认加载的是appsettings.json设置为true的第一个db连接。 */ public static (List allDbs, List slaveDbs) MutiConnectionString => MutiInitConn(); private static string DifDBConnOfSecurity(params string[] conn) { foreach (var item in conn) { try { if (File.Exists(item)) { return File.ReadAllText(item).Trim(); } } catch (System.Exception) { } } return conn[conn.Length - 1]; } public static (List, List) MutiInitConn() { List listdatabase = Appsettings.app("DBS") .Where(i => i.Enabled).ToList(); foreach (var i in listdatabase) { SpecialDbString(i); } List listdatabaseSimpleDB = new List();//单库 List listdatabaseSlaveDB = new List();//从库 // 单库,且不开启读写分离,只保留一个 if (!Appsettings.app(new string[] { "CQRSEnabled" }).ObjToBool() && !Appsettings.app(new string[] { "MutiDBEnabled" }).ObjToBool()) { if (listdatabase.Count == 1) { return (listdatabase, listdatabaseSlaveDB); } else { var dbFirst = listdatabase.FirstOrDefault(d => d.ConnId == Appsettings.app(new string[] { "MainDB" }).ObjToString()); if (dbFirst == null) { dbFirst = listdatabase.FirstOrDefault(); } listdatabaseSimpleDB.Add(dbFirst); return (listdatabaseSimpleDB, listdatabaseSlaveDB); } } // 读写分离,且必须是单库模式,获取从库 if (Appsettings.app(new string[] { "CQRSEnabled" }).ObjToBool() && !Appsettings.app(new string[] { "MutiDBEnabled" }).ObjToBool()) { if (listdatabase.Count > 1) { listdatabaseSlaveDB = listdatabase.Where(d => d.ConnId != Appsettings.app(new string[] { "MainDB" }).ObjToString()).ToList(); } } return (listdatabase, listdatabaseSlaveDB); //} } /// /// 定制Db字符串 /// 目的是保证安全:优先从本地txt文件获取,若没有文件则从appsettings.json中获取 /// /// /// private static MutiDBOperate SpecialDbString(MutiDBOperate mutiDBOperate) { if (mutiDBOperate.DbType == DataBaseType.Sqlite) { mutiDBOperate.Connection = $"DataSource=" + Path.Combine(Environment.CurrentDirectory, mutiDBOperate.Connection); } else if (mutiDBOperate.DbType == DataBaseType.SqlServer) { mutiDBOperate.Connection = DifDBConnOfSecurity(@"D:\my-file\dbCountPsw1_SqlserverConn.txt", mutiDBOperate.Connection); } else if (mutiDBOperate.DbType == DataBaseType.MySql) { mutiDBOperate.Connection = DifDBConnOfSecurity(@"D:\my-file\dbCountPsw1_MySqlConn.txt", mutiDBOperate.Connection); } else if (mutiDBOperate.DbType == DataBaseType.Oracle) { mutiDBOperate.Connection = DifDBConnOfSecurity(@"D:\my-file\dbCountPsw1_OracleConn.txt", mutiDBOperate.Connection); } return mutiDBOperate; } } public enum DataBaseType { MySql = 0, SqlServer = 1, Sqlite = 2, Oracle = 3, PostgreSQL = 4, Dm = 5, Kdbndp = 6, } public class MutiDBOperate { /// /// 连接启用开关 /// public bool Enabled { get; set; } /// /// 连接ID /// public string ConnId { get; set; } /// /// 从库执行级别,越大越先执行 /// public int HitRate { get; set; } /// /// 连接字符串 /// public string Connection { get; set; } /// /// 数据库类型 /// public DataBaseType DbType { get; set; } } }