using DigitalData.MessagingService.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces.Repositories; using DigitalData.MessagingService.Infrastructure.Persistence; using DigitalData.MessagingService.Infrastructure.Queue; using DigitalData.MessagingService.Infrastructure.Repositories; using DigitalData.MessagingService.Infrastructure.Services; using DigitalData.MessagingService.Infrastructure.Services.Background; using DigitalData.MessagingService.Publisher; using DigitalData.MessagingService.RabbitMQ; using Microsoft.AspNetCore.DataProtection; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace DigitalData.MessagingService.Infrastructure; /// /// Dependency injection configuration for Infrastructure layer /// public static class DependencyInjection { /// /// Adds Infrastructure layer services to the DI container /// public static IServiceCollection AddInfrastructure( this IServiceCollection services, IConfiguration configuration) { // --- External Services --- // Email Service - SMTP outbound (Limilabs Mail.dll) services.AddSingleton(); // Email Service - IMAP inbound (Limilabs Mail.dll) // Fresh connection per call — stateless and thread-safe. services.AddSingleton(); // PDF Processing Service (using DevExpress.Pdf) services.AddScoped(); // Encryption Service (using Data Protection API - Singleton, thread-safe) services.AddSingleton(); // --- Email Queue (RabbitMQ) --- services.AddSingleton(); services.AddMessagingServicePublisher(); // --- RabbitMQ Configuration --- services.AddRabbitMqConnectionFactory(configuration); // --- Data Protection (for encryption) --- services.AddDataProtection() .PersistKeysToFileSystem(new DirectoryInfo(@"C:\ProgramData\EmailService\Keys")) .SetApplicationName("MessagingService"); // Register Background Workers services.AddHostedService(); services.AddHostedService(); services.AddMemoryCache(); // --- Database (InMemory) --- services.AddDbContext(options => options.UseInMemoryDatabase("MessagingServiceDb")); services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); // AutoMapper - Register entity self-mappings (T -> T) for generic repository services.AddAutoMapper(config => config.AddMaps(typeof(EntitySelfMappingProfile).Assembly)); return services; } }