DependencyInjection.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging.Email;
  3. using Infrastructure.Messaging.Email;
  4. using Infrastructure.Persistence;
  5. using Infrastructure.Storage;
  6. using Microsoft.AspNetCore.DataProtection;
  7. using Microsoft.AspNetCore.Identity;
  8. using Microsoft.AspNetCore.Identity.UI.Services;
  9. using Microsoft.EntityFrameworkCore;
  10. using Microsoft.Extensions.Configuration;
  11. using Microsoft.Extensions.DependencyInjection;
  12. using SharedKernel;
  13. using SharedKernel.Storage;
  14. using StackExchange.Redis;
  15. namespace Infrastructure
  16. {
  17. public static class DependencyInjection
  18. {
  19. public static IServiceCollection AddAdminInfrastructure(this IServiceCollection services, IConfiguration configuration)
  20. {
  21. return services.AddDatabase(configuration).AddRedis(configuration).AddServices().AddHealthChecks(configuration);
  22. }
  23. // SQL 연결
  24. private static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
  25. {
  26. var dbConn = configuration.GetConnectionString("DefaultConnection");
  27. if (string.IsNullOrWhiteSpace(dbConn))
  28. {
  29. throw new InvalidOperationException("Connection string 'DefaultConnection' is not configured.");
  30. }
  31. services.AddDbContext<AppDbContext>(options => options.UseSqlServer(dbConn));
  32. services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer(dbConn));
  33. services.AddScoped<IAppDbContext>(sp => sp.GetRequiredService<AppDbContext>());
  34. return services;
  35. }
  36. // Redis 연결
  37. public static IServiceCollection AddRedis(this IServiceCollection services, IConfiguration configuration)
  38. {
  39. var settings = configuration.Get<AppSettings>()!;
  40. var redis = ConnectionMultiplexer.Connect(settings.Redis.DefaultConnection);
  41. services.AddSingleton<IConnectionMultiplexer>(redis);
  42. services.AddDataProtection().SetApplicationName(settings.App.Name).PersistKeysToStackExchangeRedis(redis, settings.Redis.DataProtectionKey).SetDefaultKeyLifetime(settings.Redis.DefaultKeyLifetime); // 기본 90일 회전
  43. // Distributed Cache 설정
  44. services.AddStackExchangeRedisCache(options =>
  45. {
  46. options.Configuration = settings.Redis.DefaultConnection;
  47. options.InstanceName = settings.Redis.CachePrefix;
  48. });
  49. return services;
  50. }
  51. private static IServiceCollection AddServices(this IServiceCollection services)
  52. {
  53. services.AddTransient<IMailService, MailService>();
  54. services.AddTransient<IEmailSender, IdentityEmailSender>();
  55. services.AddScoped<IFileStorage, LocalFileStorage>();
  56. services.AddScoped<IEditorImageService, EditorImageService>();
  57. return services;
  58. }
  59. private static IServiceCollection AddHealthChecks(this IServiceCollection services, IConfiguration configuration)
  60. {
  61. var settings = configuration.Get<AppSettings>()!;
  62. services.AddHealthChecks().AddSqlServer(settings.ConnectionStrings.DefaultConnection).AddRedis(settings.Redis.DefaultConnection);
  63. return services;
  64. }
  65. }
  66. }