AddPortalDbContext.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using EVCB_OCPP.Domain;
  2. using Microsoft.Data.SqlClient;
  3. using Microsoft.EntityFrameworkCore;
  4. using Microsoft.Extensions.Configuration;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Microsoft.Extensions.Logging;
  7. using MongoDB.Driver.Core.Configuration;
  8. using NLog.Extensions.Logging;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Configuration;
  12. using System.Diagnostics;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. namespace EVCB_OCPP.WSServer.Helper;
  17. public static class AddPortalDbContext
  18. {
  19. public const string CommandTimeoutKey = "CommandTimeout";
  20. public static IServiceCollection AddMainDbContext(this IServiceCollection services, IConfiguration configuration)
  21. {
  22. const string DbUserIdKey = "MainDbUserIdKey";
  23. const string DbPassKey = "MainDbPass";
  24. const string DbConnectionStringKey = "MainDBContext";
  25. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  26. services.AddSingleton(
  27. (serviceProvider) =>
  28. new SqlConnectionFactory<MainDBContext>(serviceProvider.GetRequiredService<ILogger<SqlConnectionFactory<MainDBContext>>>())
  29. {
  30. ConnectionString = conneciotnString
  31. });
  32. AddPortalDbContextInternal<MainDBContext>(services, configuration, conneciotnString, logToConsole: false);
  33. return services;
  34. }
  35. public static IServiceCollection AddMeterValueDbContext(this IServiceCollection services, IConfiguration configuration)
  36. {
  37. const string DbUserIdKey = "MeterValueDbUserId";
  38. const string DbPassKey = "MeterValueDbPass";
  39. const string DbConnectionStringKey = "MeterValueDBContext";
  40. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  41. services.AddSingleton(
  42. (serviceProvider) =>
  43. new SqlConnectionFactory<MeterValueDBContext>(serviceProvider.GetRequiredService<ILogger<SqlConnectionFactory<MeterValueDBContext>>>())
  44. {
  45. ConnectionString = conneciotnString
  46. });
  47. AddPortalDbContextInternal<MeterValueDBContext>(services, configuration, conneciotnString, logToConsole: false);
  48. return services;
  49. }
  50. public static IServiceCollection AddConnectionLogDbContext(this IServiceCollection services, IConfiguration configuration)
  51. {
  52. const string DbUserIdKey = "ConnectionLogDbUserId";
  53. const string DbPassKey = "ConnectionLogDbPass";
  54. const string DbConnectionStringKey = "ConnectionLogDBContext";
  55. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  56. services.AddSingleton(
  57. (serviceProvider) =>
  58. new SqlConnectionFactory<ConnectionLogDBContext>(serviceProvider.GetRequiredService<ILogger<SqlConnectionFactory<ConnectionLogDBContext>>>())
  59. {
  60. ConnectionString = conneciotnString
  61. });
  62. AddPortalDbContextInternal<ConnectionLogDBContext>(services, configuration, conneciotnString);
  63. return services;
  64. }
  65. public static IServiceCollection AddWebDBConetext(this IServiceCollection services, IConfiguration configuration)
  66. {
  67. const string DbUserIdKey = "WebDbUserId";
  68. const string DbPassKey = "WebDbPass";
  69. const string DbConnectionStringKey = "WebDBContext";
  70. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  71. services.AddSingleton(
  72. (serviceProvider) =>
  73. new SqlConnectionFactory<WebDBConetext>(serviceProvider.GetRequiredService<ILogger<SqlConnectionFactory<WebDBConetext>>>())
  74. {
  75. ConnectionString = conneciotnString
  76. });
  77. return services;
  78. }
  79. public static IServiceCollection AddOnlineLogDBContext(this IServiceCollection services, IConfiguration configuration)
  80. {
  81. const string DbUserIdKey = "OnlineLogDbUserId";
  82. const string DbPassKey = "OnlineLogDbPass";
  83. const string DbConnectionStringKey = "OnlineLogDBContext";
  84. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  85. services.AddSingleton(
  86. (serviceProvider) =>
  87. new SqlConnectionFactory<OnlineLogDBContext>(serviceProvider.GetRequiredService<ILogger<SqlConnectionFactory<OnlineLogDBContext>>>())
  88. {
  89. ConnectionString = conneciotnString
  90. });
  91. return services;
  92. }
  93. private static void AddPortalDbContextInternal<T>(
  94. IServiceCollection services, IConfiguration configuration,
  95. string connectionString,bool logToConsole = false) where T : DbContext
  96. {
  97. var commandTimeout = int.TryParse(configuration[CommandTimeoutKey], out var temp) ? temp : 180;
  98. services.AddPooledDbContextFactory<T>((serviceProvider, options) => {
  99. options.UseSqlServer(connectionString, dbOptions =>
  100. {
  101. dbOptions.CommandTimeout(commandTimeout);
  102. });
  103. options.UseLoggerFactory(serviceProvider.GetRequiredService<ILoggerFactory>());
  104. });
  105. }
  106. private static string GetConnectionString(IConfiguration configuration, string UserIdKey, string DbPassKey, string ConnectionStringKey )
  107. {
  108. string mainDbUserId = string.IsNullOrEmpty(configuration[UserIdKey]) ? string.Empty : $"user id={configuration[UserIdKey]};";
  109. string mainDbUserPass = string.IsNullOrEmpty(configuration[DbPassKey]) ? string.Empty : $"password={configuration[DbPassKey]};";
  110. return $"{configuration.GetConnectionString(ConnectionStringKey)}{mainDbUserId}{mainDbUserPass}";
  111. }
  112. }
  113. public class SqlConnectionFactory<T> where T: DbContext
  114. {
  115. private readonly ILogger<SqlConnectionFactory<T>> logger;
  116. public string ConnectionString { get; init; }
  117. public SqlConnectionFactory(ILogger<SqlConnectionFactory<T>> logger)
  118. {
  119. this.logger = logger;
  120. }
  121. public SqlConnection Create()
  122. {
  123. var sqlConnection = new SqlConnection(ConnectionString);
  124. sqlConnection.Open();
  125. return sqlConnection;
  126. }
  127. public async Task<SqlConnection> CreateAsync()
  128. {
  129. var timer = Stopwatch.StartNew();
  130. long t0, t1;
  131. var sqlConnection = new SqlConnection(ConnectionString);
  132. t0 = timer.ElapsedMilliseconds;
  133. await sqlConnection.OpenAsync();
  134. t1 = timer.ElapsedMilliseconds;
  135. timer.Stop();
  136. if (t1 > 500)
  137. {
  138. logger.LogWarning($"{typeof(T)} SqlConnection Open slow {t0}/{t1}");
  139. }
  140. return sqlConnection;
  141. }
  142. }
  143. /// <summary>
  144. /// Dummy
  145. /// </summary>
  146. public class WebDBConetext : DbContext {}
  147. /// <summary>
  148. /// Dummy
  149. /// </summary>
  150. public class OnlineLogDBContext : DbContext { }