DBServiceCollectionExtensions.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.Extensions.Hosting;
  3. using System;
  4. using StackExchange.Profiling;
  5. using FreeSql;
  6. using FreeSql.Internal.CommonProvider;
  7. using ZhonTai.Common.Helpers;
  8. using ZhonTai.Admin.Core.Configs;
  9. using ZhonTai.Admin.Core.Entities;
  10. using ZhonTai.Admin.Core.Auth;
  11. using ZhonTai.Admin.Core.Startup;
  12. using ZhonTai.Admin.Core.Consts;
  13. using System.Linq;
  14. namespace ZhonTai.Admin.Core.Db;
  15. public static class DBServiceCollectionExtensions
  16. {
  17. /// <summary>
  18. /// 添加主数据库
  19. /// </summary>
  20. /// <param name="services"></param>
  21. /// <param name="freeSqlCloud"></param>
  22. /// <param name="env"></param>
  23. /// <param name="hostAppOptions"></param>
  24. /// <returns></returns>
  25. public static void AddAdminDb(this IServiceCollection services, FreeSqlCloud freeSqlCloud, IHostEnvironment env, HostAppOptions hostAppOptions)
  26. {
  27. freeSqlCloud.Register(DbKeys.AdminDbKey, () =>
  28. {
  29. var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
  30. //创建数据库
  31. if (dbConfig.CreateDb)
  32. {
  33. DbHelper.CreateDatabaseAsync(dbConfig).Wait();
  34. }
  35. #region FreeSql
  36. var freeSqlBuilder = new FreeSqlBuilder()
  37. .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString, dbConfig.ProviderType.NotNull() ? Type.GetType(dbConfig.ProviderType) : null)
  38. .UseAutoSyncStructure(false)
  39. .UseLazyLoading(false)
  40. .UseNoneCommandParameter(true);
  41. if (dbConfig.SlaveList?.Length > 0)
  42. {
  43. var slaveList = dbConfig.SlaveList.Select(a => a.ConnectionString).ToArray();
  44. var slaveWeightList = dbConfig.SlaveList.Select(a => a.Weight).ToArray();
  45. freeSqlBuilder.UseSlave(slaveList).UseSlaveWeight(slaveWeightList);
  46. }
  47. hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
  48. #region 监听所有命令
  49. if (dbConfig.MonitorCommand)
  50. {
  51. freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
  52. {
  53. //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
  54. Console.WriteLine($"{cmd.CommandText}\r\n");
  55. });
  56. }
  57. #endregion 监听所有命令
  58. var fsql = freeSqlBuilder.Build();
  59. fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
  60. //配置实体
  61. var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
  62. DbHelper.ConfigEntity(fsql, appConfig);
  63. hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
  64. #region 初始化数据库
  65. //同步结构
  66. if (dbConfig.SyncStructure)
  67. {
  68. DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
  69. }
  70. var user = services.BuildServiceProvider().GetService<IUser>();
  71. #region 审计数据
  72. //计算服务器时间
  73. var selectProvider = fsql.Select<object>() as Select0Provider;
  74. var serverTime = fsql.Select<object>().WithSql($"select {selectProvider._commonUtils.NowUtc} a").First(a => Convert.ToDateTime("a"));
  75. var timeOffset = DateTime.UtcNow.Subtract(serverTime);
  76. DbHelper.TimeOffset = timeOffset;
  77. fsql.Aop.AuditValue += (s, e) =>
  78. {
  79. DbHelper.AuditValue(e, timeOffset, user);
  80. };
  81. #endregion 审计数据
  82. //同步数据
  83. if (dbConfig.SyncData)
  84. {
  85. DbHelper.SyncDataAsync(fsql, dbConfig, appConfig).Wait();
  86. }
  87. #endregion 初始化数据库
  88. //生成数据
  89. if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
  90. {
  91. DbHelper.GenerateDataAsync(fsql, appConfig).Wait();
  92. }
  93. #region 监听Curd操作
  94. if (dbConfig.Curd)
  95. {
  96. fsql.Aop.CurdBefore += (s, e) =>
  97. {
  98. if (appConfig.MiniProfiler)
  99. {
  100. MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
  101. }
  102. Console.WriteLine($"{e.Sql}\r\n");
  103. };
  104. fsql.Aop.CurdAfter += (s, e) =>
  105. {
  106. if (appConfig.MiniProfiler)
  107. {
  108. MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
  109. }
  110. };
  111. }
  112. #endregion 监听Curd操作
  113. if (appConfig.Tenant)
  114. {
  115. fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
  116. }
  117. #endregion FreeSql
  118. return fsql;
  119. });
  120. }
  121. }