FreeSqlCloudExtesions.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using Microsoft.Extensions.DependencyInjection;
  2. using System;
  3. using StackExchange.Profiling;
  4. using FreeSql;
  5. using ZhonTai.Admin.Core.Auth;
  6. using ZhonTai.Admin.Core.Configs;
  7. using ZhonTai.Admin.Core.Dto;
  8. using ZhonTai.Admin.Core.Entities;
  9. using ZhonTai.Admin.Domain.Tenant;
  10. using ZhonTai.Admin.Core.Consts;
  11. namespace ZhonTai.Admin.Core.Db;
  12. public static class FreeSqlCloudExtesions
  13. {
  14. /// <summary>
  15. /// 创建FreeSql实例
  16. /// </summary>
  17. /// <param name="user"></param>
  18. /// <param name="appConfig"></param>
  19. /// <param name="dbConfig"></param>
  20. /// <param name="tenant"></param>
  21. /// <returns></returns>
  22. private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, DbConfig dbConfig, CreateFreeSqlTenantDto tenant)
  23. {
  24. var freeSqlBuilder = new FreeSqlBuilder()
  25. .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
  26. .UseAutoSyncStructure(false)
  27. .UseLazyLoading(false)
  28. .UseNoneCommandParameter(true);
  29. #region 监听所有命令
  30. if (dbConfig.MonitorCommand)
  31. {
  32. freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
  33. {
  34. Console.WriteLine($"{cmd.CommandText}\r\n");
  35. });
  36. }
  37. #endregion 监听所有命令
  38. var fsql = freeSqlBuilder.Build();
  39. fsql.GlobalFilter.ApplyOnly<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
  40. //配置实体
  41. DbHelper.ConfigEntity(fsql, appConfig);
  42. #region 监听Curd操作
  43. if (dbConfig.Curd)
  44. {
  45. fsql.Aop.CurdBefore += (s, e) =>
  46. {
  47. if (appConfig.MiniProfiler)
  48. {
  49. MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
  50. }
  51. Console.WriteLine($"{e.Sql}\r\n");
  52. };
  53. fsql.Aop.CurdAfter += (s, e) =>
  54. {
  55. if (appConfig.MiniProfiler)
  56. {
  57. MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
  58. }
  59. Console.WriteLine($"{e.Sql}\r\n");
  60. };
  61. }
  62. #endregion 监听Curd操作
  63. #region 审计数据
  64. //计算服务器时间
  65. var serverTime = fsql.Ado.QuerySingle(() => DateTime.UtcNow);
  66. var timeOffset = DateTime.UtcNow.Subtract(serverTime);
  67. fsql.Aop.AuditValue += (s, e) =>
  68. {
  69. DbHelper.AuditValue(e, timeOffset, user);
  70. };
  71. #endregion 审计数据
  72. if (appConfig.Tenant)
  73. {
  74. fsql.GlobalFilter.ApplyOnly<ITenant>(FilterNames.Tenant, a => a.TenantId == user.TenantId);
  75. }
  76. return fsql;
  77. }
  78. /// <summary>
  79. /// 获得当前登录用户数据库
  80. /// </summary>
  81. /// <param name="cloud"></param>
  82. /// <param name="serviceProvider"></param>
  83. /// <returns></returns>
  84. public static IFreeSql GetCurrentDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider)
  85. {
  86. var user = serviceProvider.GetRequiredService<IUser>();
  87. var appConfig = serviceProvider.GetRequiredService<AppConfig>();
  88. var tenantId = user.TenantId;
  89. if (appConfig.Tenant && tenantId.HasValue)
  90. {
  91. var dbKey = user.DbKey.NotNull() ? user.DbKey : (DbKeys.TenantDb + tenantId);
  92. var exists = cloud.ExistsRegister(dbKey);
  93. if (!exists)
  94. {
  95. var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
  96. var tenantRepository = serviceProvider.GetRequiredService<ITenantRepository>();
  97. var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne<CreateFreeSqlTenantDto>();
  98. cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
  99. }
  100. return cloud.Use(dbKey);
  101. }
  102. else
  103. {
  104. var masterDb = cloud.Use(DbKeys.MasterDb);
  105. return masterDb;
  106. }
  107. }
  108. /// <summary>
  109. /// 获得租户数据库
  110. /// </summary>
  111. /// <param name="cloud"></param>
  112. /// <param name="serviceProvider"></param>
  113. /// <param name="tenantId"></param>
  114. /// <returns></returns>
  115. public static IFreeSql GetTenantDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider, long? tenantId = null)
  116. {
  117. if (!tenantId.HasValue)
  118. {
  119. return null;
  120. }
  121. var tenantRepository = serviceProvider.GetRequiredService<ITenantRepository>();
  122. var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne<CreateFreeSqlTenantDto>();
  123. var dbKey = tenant.DbKey.NotNull() ? tenant.DbKey : (DbKeys.TenantDb + tenantId);
  124. var exists = cloud.ExistsRegister(dbKey);
  125. if (!exists)
  126. {
  127. var user = serviceProvider.GetRequiredService<IUser>();
  128. var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
  129. var appConfig = serviceProvider.GetRequiredService<AppConfig>();
  130. cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
  131. }
  132. return cloud.Use(dbKey);
  133. }
  134. }