You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.8 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<MutiDBOperate> allDbs, List<MutiDBOperate> 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<MutiDBOperate>, List<MutiDBOperate>) MutiInitConn()
{
List<MutiDBOperate> listdatabase = Appsettings.app<MutiDBOperate>("DBS")
.Where(i => i.Enabled).ToList();
foreach (var i in listdatabase)
{
SpecialDbString(i);
}
List<MutiDBOperate> listdatabaseSimpleDB = new List<MutiDBOperate>();//单库
List<MutiDBOperate> listdatabaseSlaveDB = new List<MutiDBOperate>();//从库
// 单库,且不开启读写分离,只保留一个
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);
//}
}
/// <summary>
/// 定制Db字符串
/// 目的是保证安全优先从本地txt文件获取若没有文件则从appsettings.json中获取
/// </summary>
/// <param name="mutiDBOperate"></param>
/// <returns></returns>
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
{
/// <summary>
/// 连接启用开关
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// 连接ID
/// </summary>
public string ConnId { get; set; }
/// <summary>
/// 从库执行级别,越大越先执行
/// </summary>
public int HitRate { get; set; }
/// <summary>
/// 连接字符串
/// </summary>
public string Connection { get; set; }
/// <summary>
/// 数据库类型
/// </summary>
public DataBaseType DbType { get; set; }
}
}