using EVCB_OCPP.Domain.ConnectionFactory; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EVCB_OCPP.Domain.Extensions; public static class IServiceCollectionExtension { public const string CommandTimeoutKey = "CommandTimeout"; public const string MainDbUserIdKey = "MainDbUserIdKey"; public const string MainDbPassKey = "MainDbPass"; public const string MainDbConnectionStringKey = "MainDBContext"; public const string MeterDbUserIdKey = "MeterValueDbUserId"; public const string MeterDbPassKey = "MeterValueDbPass"; public const string MeterDbConnectionStringKey = "MeterValueDBContext"; public const string ConnectionLogDbUserIdKey = "ConnectionLogDbUserId"; public const string ConnectionLogDbPassKey = "ConnectionLogDbPass"; public const string ConnectionLogDbConnectionStringKey = "ConnectionLogDBContext"; public static IServiceCollection AddMainDbContext(this IServiceCollection services, IConfiguration configuration) { var conneciotnString = configuration.GetConnectionString(MainDbUserIdKey, MainDbPassKey, MainDbConnectionStringKey); services.AddSqlConnectionFactory(conneciotnString); AddPortalDbContextInternal(services, configuration, conneciotnString, logToConsole: false); return services; } public static IServiceCollection AddMeterValueDbContext(this IServiceCollection services, IConfiguration configuration) { var conneciotnString = configuration.GetConnectionString(MeterDbUserIdKey, MeterDbPassKey, MeterDbConnectionStringKey); services.AddSqlConnectionFactory(conneciotnString); AddPortalDbContextInternal(services, configuration, conneciotnString, logToConsole: false); return services; } public static IServiceCollection AddConnectionLogDbContext(this IServiceCollection services, IConfiguration configuration) { var conneciotnString = configuration.GetConnectionString(ConnectionLogDbUserIdKey, ConnectionLogDbPassKey, ConnectionLogDbConnectionStringKey); services.AddSqlConnectionFactory(conneciotnString); AddPortalDbContextInternal(services, configuration, conneciotnString, logToConsole: false); return services; } public static void AddSqlConnectionFactory(this IServiceCollection services, string conneciotnString) where T : DbContext { services.AddSingleton>( (serviceProvider) => new SqlConnectionFactory(serviceProvider.GetRequiredService>>()) { ConnectionString = conneciotnString }); } public static void AddPortalDbContextInternal( IServiceCollection services, IConfiguration configuration, string connectionString, bool logToConsole = false) where T : DbContext { var commandTimeout = int.TryParse(configuration[CommandTimeoutKey], out var temp) ? temp : 180; services.AddPooledDbContextFactory((serviceProvider, options) => { options.UseSqlServer(connectionString, dbOptions => { dbOptions.CommandTimeout(commandTimeout); }); options.UseLoggerFactory(serviceProvider.GetRequiredService()); }); } public static string GetConnectionString(this IConfiguration configuration, string UserIdKey, string DbPassKey, string ConnectionStringKey) { string dbUserId = string.IsNullOrEmpty(configuration[UserIdKey]) ? string.Empty : $"user id={configuration[UserIdKey]};"; string dbUserPass = string.IsNullOrEmpty(configuration[DbPassKey]) ? string.Empty : $"password={configuration[DbPassKey]};"; string connectionString = configuration.GetConnectionString(ConnectionStringKey); var builder = new SqlConnectionStringBuilder(connectionString); if (!string.IsNullOrEmpty(dbUserId)) { builder.UserID = dbUserId; } if (!string.IsNullOrEmpty(dbUserPass)) { builder.Password = dbUserPass; } return builder.ToString(); } }