using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Mirea.Api.DataAccess.Application.Interfaces.DbContexts.Schedule; using Mirea.Api.DataAccess.Domain.Schedule; using Mirea.Api.DataAccess.Persistence.Common; using Mirea.Api.DataAccess.Persistence.Contexts.Schedule; using Mirea.Api.DataAccess.Persistence.EntityTypeConfigurations; using System; using System.Linq; using System.Reflection; namespace Mirea.Api.DataAccess.Persistence; public static class DependencyInjection { public static IServiceCollection AddPersistence(this IServiceCollection services, DatabaseProvider dbProvider, string connection) { services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(options => UseDatabase(options).CreateDbContext(dbProvider)); services.AddDbContext(DbConfig); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); services.AddScoped(provider => provider.GetRequiredService()); return services; DbContextOptionsBuilder UseDatabase(DbContextOptionsBuilder options) { return dbProvider switch { DatabaseProvider.Sqlite => options.UseSqlite(connection), DatabaseProvider.Mysql => options.UseMySql(connection, ServerVersion.AutoDetect(connection)), DatabaseProvider.Postgresql => options.UseNpgsql(connection), _ => throw new ArgumentException("Unsupported database provider", Enum.GetName(dbProvider)) }; } } }