AddPortalDbContext.cs 5.7 KB

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