diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs index f6b5789..f6b1f86 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs @@ -7,9 +7,7 @@ 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.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -23,10 +21,12 @@ public static class DependencyInjection /// /// Adds Infrastructure layer services to the DI container /// - public static IServiceCollection AddInfrastructure( - this IServiceCollection services, - IConfiguration configuration) + public static IServiceCollection AddInfrastructure(this IServiceCollection services, Action configure) { + var configuration = new MessagingServiceInfrastructureConfiguration(services); + configure.Invoke(configuration); + configuration.EnsureRabbitMqConnectionFactoryAdded(); + // --- External Services --- // OAuth2 token services — provider-specific implementations registered separately, // dispatcher is the single IOAuth2TokenService consumed by all other services. @@ -55,9 +55,6 @@ public static class DependencyInjection services.AddSingleton(); services.AddMessagingServicePublisher(); - // --- RabbitMQ Configuration --- - services.AddRabbitMqConnectionFactory(configuration); - // ConsumerInitHealthCheck, RabbitMqConnectionHealthCheck and EmailSyncWorkerHealthCheck are // registered as singletons here so background workers can inject and update them. // Health check pipeline is wired up in the API layer via AddHealthChecks(). @@ -79,8 +76,7 @@ public static class DependencyInjection services.AddMemoryCache(); // --- Database (InMemory) --- - services.AddDbContext(options => - options.UseInMemoryDatabase("MessagingServiceDb")); + services.AddDbContext(options => options.UseInMemoryDatabase("MessagingServiceDb")); services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); @@ -91,5 +87,4 @@ public static class DependencyInjection return services; } -} - +} \ No newline at end of file diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/MessagingServiceInfrastructureConfiguration.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/MessagingServiceInfrastructureConfiguration.cs new file mode 100644 index 0000000..b085f5d --- /dev/null +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/MessagingServiceInfrastructureConfiguration.cs @@ -0,0 +1,40 @@ +using DigitalData.MessagingService.RabbitMQ; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace DigitalData.MessagingService.Infrastructure; + +public class MessagingServiceInfrastructureConfiguration +{ + internal IServiceCollection Services { get; } + + private bool _rabbitMqConnectionFactoryAdded = false; + + internal MessagingServiceInfrastructureConfiguration(IServiceCollection services) + { + Services = services; + } + + public void EnsureRabbitMqConnectionFactoryAdded() + { + if (!_rabbitMqConnectionFactoryAdded) + { + throw new InvalidOperationException("RabbitMQ connection factory has not been added. Please call AddRabbitMqConnectionFactory() before using this configuration."); + } + } + + public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(Action configure) + { + Services.AddRabbitMqConnectionFactory(configure); + _rabbitMqConnectionFactoryAdded = true; + return this; + } + + public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(IConfiguration configuration, string sectionName = RabbitMqConfiguration.SectionName) + { + Services.AddRabbitMqConnectionFactory(configuration, sectionName); + _rabbitMqConnectionFactoryAdded = true; + return this; + } + +}