using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using StackExchange.Profiling;
using FreeSql;
using FreeSql.Internal.CommonProvider;
using ZhonTai.Common.Helpers;
using ZhonTai.Admin.Core.Configs;
using ZhonTai.Admin.Core.Entities;
using ZhonTai.Admin.Core.Auth;
using ZhonTai.Admin.Core.Startup;
using ZhonTai.Admin.Core.Consts;
using System.Linq;
namespace ZhonTai.Admin.Core.Db;
public static class DBServiceCollectionExtensions
{
///
/// 添加主数据库
///
///
///
///
///
///
public static void AddAdminDb(this IServiceCollection services, FreeSqlCloud freeSqlCloud, IHostEnvironment env, HostAppOptions hostAppOptions)
{
freeSqlCloud.Register(DbKeys.AdminDbKey, () =>
{
var dbConfig = ConfigHelper.Get("dbconfig", env.EnvironmentName);
//创建数据库
if (dbConfig.CreateDb)
{
DbHelper.CreateDatabaseAsync(dbConfig).Wait();
}
#region FreeSql
var freeSqlBuilder = new FreeSqlBuilder()
.UseConnectionString(dbConfig.Type, dbConfig.ConnectionString, dbConfig.ProviderType.NotNull() ? Type.GetType(dbConfig.ProviderType) : null)
.UseAutoSyncStructure(false)
.UseLazyLoading(false)
.UseNoneCommandParameter(true);
if (dbConfig.SlaveList?.Length > 0)
{
var slaveList = dbConfig.SlaveList.Select(a => a.ConnectionString).ToArray();
var slaveWeightList = dbConfig.SlaveList.Select(a => a.Weight).ToArray();
freeSqlBuilder.UseSlave(slaveList).UseSlaveWeight(slaveWeightList);
}
hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
#region 监听所有命令
if (dbConfig.MonitorCommand)
{
freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
{
//Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
Console.WriteLine($"{cmd.CommandText}\r\n");
});
}
#endregion 监听所有命令
var fsql = freeSqlBuilder.Build();
fsql.GlobalFilter.Apply("SoftDelete", a => a.IsDeleted == false);
//配置实体
var appConfig = ConfigHelper.Get("appconfig", env.EnvironmentName);
DbHelper.ConfigEntity(fsql, appConfig);
hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
#region 初始化数据库
//同步结构
if (dbConfig.SyncStructure)
{
DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
}
var user = services.BuildServiceProvider().GetService();
#region 审计数据
//计算服务器时间
var selectProvider = fsql.Select