AddPortalDbContext.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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.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. new SqlConnectionFactory<MainDBContext>()
  28. {
  29. ConnectionString = conneciotnString
  30. });
  31. AddPortalDbContextInternal<MainDBContext>(services, configuration, conneciotnString, logToConsole: false);
  32. return services;
  33. }
  34. public static IServiceCollection AddMeterValueDbContext(this IServiceCollection services, IConfiguration configuration)
  35. {
  36. const string DbUserIdKey = "MeterValueDbUserId";
  37. const string DbPassKey = "MeterValueDbPass";
  38. const string DbConnectionStringKey = "MeterValueDBContext";
  39. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  40. services.AddSingleton(
  41. new SqlConnectionFactory<MeterValueDBContext>()
  42. {
  43. ConnectionString = conneciotnString
  44. });
  45. AddPortalDbContextInternal<MeterValueDBContext>(services, configuration, conneciotnString, logToConsole: false);
  46. return services;
  47. }
  48. public static IServiceCollection AddConnectionLogDbContext(this IServiceCollection services, IConfiguration configuration)
  49. {
  50. const string DbUserIdKey = "ConnectionLogDbUserId";
  51. const string DbPassKey = "ConnectionLogDbPass";
  52. const string DbConnectionStringKey = "ConnectionLogDBContext";
  53. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  54. services.AddSingleton(
  55. new SqlConnectionFactory<ConnectionLogDBContext>()
  56. {
  57. ConnectionString = conneciotnString
  58. });
  59. AddPortalDbContextInternal<ConnectionLogDBContext>(services, configuration, conneciotnString);
  60. return services;
  61. }
  62. public static IServiceCollection AddWebDBConetext(this IServiceCollection services, IConfiguration configuration)
  63. {
  64. const string DbUserIdKey = "WebDbUserId";
  65. const string DbPassKey = "WebDbPass";
  66. const string DbConnectionStringKey = "WebDBContext";
  67. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  68. services.AddSingleton(
  69. new SqlConnectionFactory<WebDBConetext>()
  70. {
  71. ConnectionString = conneciotnString
  72. });
  73. return services;
  74. }
  75. public static IServiceCollection AddOnlineLogDBContext(this IServiceCollection services, IConfiguration configuration)
  76. {
  77. const string DbUserIdKey = "OnlineLogDbUserId";
  78. const string DbPassKey = "OnlineLogDbPass";
  79. const string DbConnectionStringKey = "OnlineLogDBContext";
  80. var conneciotnString = GetConnectionString(configuration, DbUserIdKey, DbPassKey, DbConnectionStringKey);
  81. services.AddSingleton(
  82. new SqlConnectionFactory<OnlineLogDBContext>()
  83. {
  84. ConnectionString = conneciotnString
  85. });
  86. return services;
  87. }
  88. private static void AddPortalDbContextInternal<T>(
  89. IServiceCollection services, IConfiguration configuration,
  90. string connectionString,bool logToConsole = false) where T : DbContext
  91. {
  92. var commandTimeout = int.TryParse(configuration[CommandTimeoutKey], out var temp) ? temp : 180;
  93. services.AddPooledDbContextFactory<T>((serviceProvider, options) => {
  94. options.UseSqlServer(connectionString, dbOptions =>
  95. {
  96. dbOptions.CommandTimeout(commandTimeout);
  97. });
  98. options.UseLoggerFactory(serviceProvider.GetRequiredService<ILoggerFactory>());
  99. });
  100. }
  101. private static string GetConnectionString(IConfiguration configuration, string UserIdKey, string DbPassKey, string ConnectionStringKey )
  102. {
  103. string mainDbUserId = string.IsNullOrEmpty(configuration[UserIdKey]) ? string.Empty : $"user id={configuration[UserIdKey]};";
  104. string mainDbUserPass = string.IsNullOrEmpty(configuration[DbPassKey]) ? string.Empty : $"password={configuration[DbPassKey]};";
  105. return $"{configuration.GetConnectionString(ConnectionStringKey)}{mainDbUserId}{mainDbUserPass}";
  106. }
  107. }
  108. public class SqlConnectionFactory<T> where T: DbContext
  109. {
  110. public string ConnectionString { get; init; }
  111. public SqlConnectionFactory() { }
  112. public SqlConnection Create()
  113. {
  114. var sqlConnection = new SqlConnection(ConnectionString);
  115. sqlConnection.Open();
  116. return sqlConnection;
  117. }
  118. public async Task<SqlConnection> CreateAsync()
  119. {
  120. var sqlConnection = new SqlConnection(ConnectionString);
  121. await sqlConnection.OpenAsync();
  122. return sqlConnection;
  123. }
  124. }
  125. /// <summary>
  126. /// Dummy
  127. /// </summary>
  128. public class WebDBConetext : DbContext {}
  129. /// <summary>
  130. /// Dummy
  131. /// </summary>
  132. public class OnlineLogDBContext : DbContext { }