Refactored the RabbitMQ-based email queue system by splitting `OutgoingEmailQueue` into `OutgoingEmailPublisher` and `OutgoingEmailConsumer` to separate publishing and consuming responsibilities. - Introduced `IOutgoingEmailConsumer` and renamed `IOutgoingEmailQueue` to `IOutgoingEmailPublisher` for clarity. - Updated `SendEmailCommandHandler` to use the new publisher abstraction. - Added `RabbitMqConnectionFactory` to centralize RabbitMQ connection management. - Updated dependency injection to register new services. - Simplified RabbitMQ initialization logic by delegating it to `RabbitMqConnectionFactory`. - Enhanced logging for better observability. - Improved modularity and maintainability by separating concerns between message publishing and consuming.
54 lines
2.2 KiB
C#
54 lines
2.2 KiB
C#
using DigitalData.MessagingService.Application.Common.Interfaces;
|
|
using DigitalData.MessagingService.Infrastructure.Messaging;
|
|
using DigitalData.MessagingService.Infrastructure.Queue;
|
|
using DigitalData.MessagingService.Infrastructure.Services;
|
|
using DigitalData.MessagingService.Infrastructure.Services.Background;
|
|
using Microsoft.AspNetCore.DataProtection;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
namespace DigitalData.MessagingService.Infrastructure;
|
|
|
|
/// <summary>
|
|
/// Dependency injection configuration for Infrastructure layer
|
|
/// </summary>
|
|
public static class DependencyInjection
|
|
{
|
|
/// <summary>
|
|
/// Adds Infrastructure layer services to the DI container
|
|
/// </summary>
|
|
public static IServiceCollection AddInfrastructure(
|
|
this IServiceCollection services,
|
|
IConfiguration configuration)
|
|
{
|
|
// --- External Services ---
|
|
// Email Service (using Limilabs Mail.dll - Singleton for use in EmailSenderWorker)
|
|
services.AddSingleton<IEmailService, LimilabsEmailService>();
|
|
|
|
// PDF Processing Service (using DevExpress.Pdf)
|
|
services.AddScoped<IPdfProcessingService, DevExpressPdfProcessingService>();
|
|
|
|
// Encryption Service (using Data Protection API - Singleton, thread-safe)
|
|
services.AddSingleton<IEncryptionService, DataProtectionEncryptionService>();
|
|
|
|
// --- Email Queue (RabbitMQ) ---
|
|
services.AddSingleton<IOutgoingEmailConsumer, OutgoingEmailConsumer>();
|
|
services.AddSingleton<IOutgoingEmailPublisher, OutgoingEmailPublisher>();
|
|
services.AddSingleton<RabbitMqConnectionFactory>();
|
|
|
|
// --- RabbitMQ Configuration ---
|
|
services.Configure<RabbitMqConfiguration>(
|
|
configuration.GetSection(RabbitMqConfiguration.SectionName));
|
|
|
|
// --- Data Protection (for encryption) ---
|
|
services.AddDataProtection()
|
|
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\ProgramData\EmailService\Keys"))
|
|
.SetApplicationName("MessagingService");
|
|
|
|
// Register Background Workers
|
|
services.AddHostedService<AsyncInitWorker>();
|
|
|
|
return services;
|
|
}
|
|
}
|