DBServiceCollectionExtensions.cs 5.6 KB

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