AddPortalDbContext.cs 6.7 KB

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