IServiceCollectionExtension.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using EVCB_OCPP.Domain.ConnectionFactory;
  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 System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace EVCB_OCPP.Domain.Extensions;
  13. public static class IServiceCollectionExtension
  14. {
  15. public const string CommandTimeoutKey = "CommandTimeout";
  16. public const string MainDbUserIdKey = "MainDbUserIdKey";
  17. public const string MainDbPassKey = "MainDbPass";
  18. public const string MainDbConnectionStringKey = "MainDBContext";
  19. public const string MeterDbUserIdKey = "MeterValueDbUserId";
  20. public const string MeterDbPassKey = "MeterValueDbPass";
  21. public const string MeterDbConnectionStringKey = "MeterValueDBContext";
  22. public const string ConnectionLogDbUserIdKey = "ConnectionLogDbUserId";
  23. public const string ConnectionLogDbPassKey = "ConnectionLogDbPass";
  24. public const string ConnectionLogDbConnectionStringKey = "ConnectionLogDBContext";
  25. public static IServiceCollection AddMainDbContext(this IServiceCollection services, IConfiguration configuration)
  26. {
  27. var conneciotnString = configuration.GetConnectionString(MainDbUserIdKey, MainDbPassKey, MainDbConnectionStringKey);
  28. services.AddSqlConnectionFactory<MainDBContext>(conneciotnString);
  29. AddPortalDbContextInternal<MainDBContext>(services, configuration, conneciotnString, logToConsole: false);
  30. return services;
  31. }
  32. public static IServiceCollection AddMeterValueDbContext(this IServiceCollection services, IConfiguration configuration)
  33. {
  34. var conneciotnString = configuration.GetConnectionString(MeterDbUserIdKey, MeterDbPassKey, MeterDbConnectionStringKey);
  35. services.AddSqlConnectionFactory<MeterValueDBContext>(conneciotnString);
  36. AddPortalDbContextInternal<MeterValueDBContext>(services, configuration, conneciotnString, logToConsole: false);
  37. return services;
  38. }
  39. public static IServiceCollection AddConnectionLogDbContext(this IServiceCollection services, IConfiguration configuration)
  40. {
  41. var conneciotnString = configuration.GetConnectionString(ConnectionLogDbUserIdKey, ConnectionLogDbPassKey, ConnectionLogDbConnectionStringKey);
  42. services.AddSqlConnectionFactory<ConnectionLogDBContext>(conneciotnString);
  43. AddPortalDbContextInternal<ConnectionLogDBContext>(services, configuration, conneciotnString, logToConsole: false);
  44. return services;
  45. }
  46. public static void AddSqlConnectionFactory<T>(this IServiceCollection services, string conneciotnString) where T : DbContext
  47. {
  48. services.AddSingleton<ISqlConnectionFactory<T>>(
  49. (serviceProvider) =>
  50. new SqlConnectionFactory<T>(serviceProvider.GetRequiredService<ILogger<SqlConnectionFactory<T>>>())
  51. {
  52. ConnectionString = conneciotnString
  53. });
  54. }
  55. public static void AddPortalDbContextInternal<T>(
  56. IServiceCollection services, IConfiguration configuration,
  57. string connectionString, bool logToConsole = false) where T : DbContext
  58. {
  59. var commandTimeout = int.TryParse(configuration[CommandTimeoutKey], out var temp) ? temp : 180;
  60. services.AddPooledDbContextFactory<T>((serviceProvider, options) => {
  61. options.UseSqlServer(connectionString, dbOptions =>
  62. {
  63. dbOptions.CommandTimeout(commandTimeout);
  64. });
  65. options.UseLoggerFactory(serviceProvider.GetRequiredService<ILoggerFactory>());
  66. });
  67. }
  68. public static string GetConnectionString(this IConfiguration configuration, string UserIdKey, string DbPassKey, string ConnectionStringKey)
  69. {
  70. string dbUserId = string.IsNullOrEmpty(configuration[UserIdKey]) ? string.Empty : $"user id={configuration[UserIdKey]};";
  71. string dbUserPass = string.IsNullOrEmpty(configuration[DbPassKey]) ? string.Empty : $"password={configuration[DbPassKey]};";
  72. string connectionString = configuration.GetConnectionString(ConnectionStringKey);
  73. var builder = new SqlConnectionStringBuilder(connectionString);
  74. if (!string.IsNullOrEmpty(dbUserId))
  75. {
  76. builder.UserID = dbUserId;
  77. }
  78. if (!string.IsNullOrEmpty(dbUserPass))
  79. {
  80. builder.Password = dbUserPass;
  81. }
  82. return builder.ToString();
  83. }
  84. }