using Application.Abstractions.Data; using Application.Abstractions.Identity; using Application.Abstractions.Messaging.Email; using Infrastructure.Messaging.Email; using Infrastructure.Persistence; using Infrastructure.Persistence.Identity; using Infrastructure.Storage; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using SharedKernel; using SharedKernel.Storage; using StackExchange.Redis; namespace Infrastructure { public static class DependencyInjection { public static IServiceCollection AddAdminInfrastructure(this IServiceCollection services, IConfiguration configuration) { return services.AddDatabase(configuration).AddRedis(configuration).AddServices().AddHealthChecks(configuration); } // SQL ¿¬°á private static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration) { var dbConn = configuration.GetConnectionString("DefaultConnection"); if (string.IsNullOrWhiteSpace(dbConn)) { throw new InvalidOperationException("Connection string 'DefaultConnection' is not configured."); } services.AddDbContext(options => options.UseSqlServer(dbConn)); services.AddDbContext(options => options.UseSqlServer(dbConn)); services.AddScoped(sp => sp.GetRequiredService()); return services; } // Redis ¿¬°á public static IServiceCollection AddRedis(this IServiceCollection services, IConfiguration configuration) { var settings = configuration.Get()!; var redis = ConnectionMultiplexer.Connect(settings.Redis.DefaultConnection); services.AddSingleton(redis); services.AddDataProtection().SetApplicationName(settings.App.Name).PersistKeysToStackExchangeRedis(redis, settings.Redis.DataProtectionKey).SetDefaultKeyLifetime(settings.Redis.DefaultKeyLifetime); // ±âº» 90ÀÏ È¸Àü // Distributed Cache ¼³Á¤ services.AddStackExchangeRedisCache(options => { options.Configuration = settings.Redis.DefaultConnection; options.InstanceName = settings.Redis.CachePrefix; }); return services; } private static IServiceCollection AddServices(this IServiceCollection services) { services.AddTransient(); services.AddTransient(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); return services; } private static IServiceCollection AddHealthChecks(this IServiceCollection services, IConfiguration configuration) { var settings = configuration.Get()!; services.AddHealthChecks().AddSqlServer(settings.ConnectionStrings.DefaultConnection).AddRedis(settings.Redis.DefaultConnection); return services; } } }