From 51d8931dbe9a31428d855cac8284cc2e5b2f0b35 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 4 Nov 2026 14:52:52 +0100 Subject: [PATCH] refactor(rabbitmq)!: rename RabbitMqConfiguration to RabbitMqConnectionConfiguration Rename the RabbitMQ options type to make its purpose explicit and update all consumers in the RabbitMQ, Infrastructure, Publisher, Client and test projects. Inline the connection factory registration in the DI extensions instead of the private AddDefaultServices helper. BREAKING CHANGE: RabbitMqConfiguration is now RabbitMqConnectionConfiguration. --- ...agingServiceInfrastructureConfiguration.cs | 5 ++--- .../Queue/SendingEmailConsumerPool.cs | 2 +- .../Services/Background/ConsumerInitWorker.cs | 2 +- .../SendingEmailPublisher.cs | 4 ++-- .../DependencyInjection.cs | 20 +++++-------------- ....cs => RabbitMqConnectionConfiguration.cs} | 2 +- .../RabbitMqConnectionFactory.cs | 4 ++-- .../OnReconnect.cs | 2 +- .../RabbitMqTestConfig.cs | 2 +- .../Unit/EmailSenderUrlParsingTests.cs | 10 +++++----- 10 files changed, 21 insertions(+), 32 deletions(-) rename src/infrastructure/DigitalData.MessagingService.RabbitMQ/{RabbitMqConfiguration.cs => RabbitMqConnectionConfiguration.cs} (98%) diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection/MessagingServiceInfrastructureConfiguration.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection/MessagingServiceInfrastructureConfiguration.cs index 73287d2..b49f80a 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection/MessagingServiceInfrastructureConfiguration.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection/MessagingServiceInfrastructureConfiguration.cs @@ -28,14 +28,14 @@ public class MessagingServiceInfrastructureConfiguration } } - public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(Action configure) + public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(Action configure) { Services.AddRabbitMqConnectionFactory(configure); _configured.RabbitMqConnectionFactory = true; return this; } - public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(IConfiguration configuration, string sectionName = RabbitMqConfiguration.SectionName) + public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(IConfiguration configuration, string sectionName = RabbitMqConnectionConfiguration.SectionName) { Services.AddRabbitMqConnectionFactory(configuration, sectionName); _configured.RabbitMqConnectionFactory = true; @@ -57,5 +57,4 @@ public class MessagingServiceInfrastructureConfiguration return this; } #endregion EmailAccountsOptions - } diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Queue/SendingEmailConsumerPool.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Queue/SendingEmailConsumerPool.cs index 7242eec..f8659fd 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Queue/SendingEmailConsumerPool.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Queue/SendingEmailConsumerPool.cs @@ -17,7 +17,7 @@ public sealed class SendingEmailConsumerPool : IAsyncDisposable private readonly int _concurrency; public SendingEmailConsumerPool( - IOptions config, + IOptions config, IEmailService emailService, IServiceScopeFactory scopeFactory, RabbitMqConnectionFactory cnnFactory, diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/ConsumerInitWorker.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/ConsumerInitWorker.cs index 046877b..47ab803 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/ConsumerInitWorker.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/ConsumerInitWorker.cs @@ -14,7 +14,7 @@ namespace DigitalData.MessagingService.Infrastructure.Services.Background; public class ConsumerInitWorker( SendingEmailConsumerPool ConsumerPool, ILogger Logger, - IOptions RabbitMqOptions, + IOptions RabbitMqOptions, ConsumerInitHealthCheck HealthCheck) : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) diff --git a/src/infrastructure/DigitalData.MessagingService.Publisher/SendingEmailPublisher.cs b/src/infrastructure/DigitalData.MessagingService.Publisher/SendingEmailPublisher.cs index dd630e8..9be1fdf 100644 --- a/src/infrastructure/DigitalData.MessagingService.Publisher/SendingEmailPublisher.cs +++ b/src/infrastructure/DigitalData.MessagingService.Publisher/SendingEmailPublisher.cs @@ -16,12 +16,12 @@ namespace DigitalData.MessagingService.Publisher; /// public sealed class SendingEmailPublisher : ISendingEmailPublisher, IAsyncDisposable { - private readonly RabbitMqConfiguration _config; + private readonly RabbitMqConnectionConfiguration _config; private readonly ILogger _logger; private readonly RabbitMqConnectionFactory _cnnFactory; private readonly Lazy> _lazyChannel; - public SendingEmailPublisher(IOptions config, ILogger logger, RabbitMqConnectionFactory cnnFactory) + public SendingEmailPublisher(IOptions config, ILogger logger, RabbitMqConnectionFactory cnnFactory) { _config = config.Value; _logger = logger; diff --git a/src/infrastructure/DigitalData.MessagingService.RabbitMQ/DependencyInjection.cs b/src/infrastructure/DigitalData.MessagingService.RabbitMQ/DependencyInjection.cs index 8b4176a..0948da2 100644 --- a/src/infrastructure/DigitalData.MessagingService.RabbitMQ/DependencyInjection.cs +++ b/src/infrastructure/DigitalData.MessagingService.RabbitMQ/DependencyInjection.cs @@ -9,36 +9,26 @@ namespace DigitalData.MessagingService.RabbitMQ /// public static class DependencyInjection { - private static IServiceCollection AddDefaultServices(this IServiceCollection services) - { - services.AddSingleton(); - return services; - } - /// /// Adds Infrastructure layer services to the DI container /// - public static IServiceCollection AddRabbitMqConnectionFactory(this IServiceCollection services, Action configure) + public static IServiceCollection AddRabbitMqConnectionFactory(this IServiceCollection services, Action configure) { - services.AddDefaultServices(); - // --- RabbitMQ Configuration --- services.Configure(configure); - return services; + return services.AddSingleton(); } /// /// Adds Infrastructure layer services to the DI container /// - public static IServiceCollection AddRabbitMqConnectionFactory(this IServiceCollection services, IConfiguration configuration, string sectionName = RabbitMqConfiguration.SectionName) + public static IServiceCollection AddRabbitMqConnectionFactory(this IServiceCollection services, IConfiguration configuration, string sectionName = RabbitMqConnectionConfiguration.SectionName) { - services.AddDefaultServices(); - // --- RabbitMQ Configuration --- - services.Configure(configuration.GetSection(sectionName)); + services.Configure(configuration.GetSection(sectionName)); - return services; + return services.AddSingleton(); } } } \ No newline at end of file diff --git a/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConfiguration.cs b/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConnectionConfiguration.cs similarity index 98% rename from src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConfiguration.cs rename to src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConnectionConfiguration.cs index 076f088..0bee47c 100644 --- a/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConfiguration.cs +++ b/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConnectionConfiguration.cs @@ -3,7 +3,7 @@ namespace DigitalData.MessagingService.RabbitMQ /// /// Configuration for RabbitMQ connection /// - public class RabbitMqConfiguration + public class RabbitMqConnectionConfiguration { /// /// Configuration section name in appsettings.json diff --git a/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConnectionFactory.cs b/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConnectionFactory.cs index ff5df33..c321706 100644 --- a/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConnectionFactory.cs +++ b/src/infrastructure/DigitalData.MessagingService.RabbitMQ/RabbitMqConnectionFactory.cs @@ -12,7 +12,7 @@ namespace DigitalData.MessagingService.RabbitMQ { private readonly CancellationTokenSource _consumerCts = new CancellationTokenSource(); - private readonly RabbitMqConfiguration _config; + private readonly RabbitMqConnectionConfiguration _config; private readonly ILogger #if nullable @@ -41,7 +41,7 @@ namespace DigitalData.MessagingService.RabbitMQ return new AsyncEventingBasicConsumer(channel); } - public RabbitMqConnectionFactory(IOptions config) + public RabbitMqConnectionFactory(IOptions config) { _config = config.Value; _lazyConnectionProvider = new Lazy>(async () => diff --git a/src/presentation/DigitalData.MessagingService.Client/OnReconnect.cs b/src/presentation/DigitalData.MessagingService.Client/OnReconnect.cs index 631eb0b..583154c 100644 --- a/src/presentation/DigitalData.MessagingService.Client/OnReconnect.cs +++ b/src/presentation/DigitalData.MessagingService.Client/OnReconnect.cs @@ -1,7 +1,7 @@ namespace DigitalData.MessagingService.Client; /// -/// Defines the behavior when is called +/// Defines the behavior when is called /// while a connection has already been established. /// public enum OnReconnect diff --git a/tests/DigitalData.MessagingService.Tests/RabbitMqTestConfig.cs b/tests/DigitalData.MessagingService.Tests/RabbitMqTestConfig.cs index 2a27fb7..8e8d4c3 100644 --- a/tests/DigitalData.MessagingService.Tests/RabbitMqTestConfig.cs +++ b/tests/DigitalData.MessagingService.Tests/RabbitMqTestConfig.cs @@ -21,7 +21,7 @@ internal static class RabbitMqTestConfig public const string DlqExchangeName = "emailprofiler.emails.dlq"; public const string DlqRoutingKey = "email.outbox.dlq"; - public static void Apply(RabbitMqConfiguration cfg) + public static void Apply(RabbitMqConnectionConfiguration cfg) { cfg.HostName = HostName; cfg.Port = Port; diff --git a/tests/DigitalData.MessagingService.Tests/Unit/EmailSenderUrlParsingTests.cs b/tests/DigitalData.MessagingService.Tests/Unit/EmailSenderUrlParsingTests.cs index 595a8ae..7f8ccd7 100644 --- a/tests/DigitalData.MessagingService.Tests/Unit/EmailSenderUrlParsingTests.cs +++ b/tests/DigitalData.MessagingService.Tests/Unit/EmailSenderUrlParsingTests.cs @@ -11,12 +11,12 @@ public sealed class EmailSenderUrlParsingTests { /// /// Applies the same URL-parsing logic used by the URL overload to a fresh - /// and returns it for assertion. + /// and returns it for assertion. /// - private static RabbitMqConfiguration ParseUrl(string url, string username, string password) + private static RabbitMqConnectionConfiguration ParseUrl(string url, string username, string password) { var uri = new Uri(url); - var cfg = new RabbitMqConfiguration(); + var cfg = new RabbitMqConnectionConfiguration(); cfg.HostName = uri.Host; cfg.Port = uri.IsDefaultPort ? 5672 : uri.Port; @@ -95,7 +95,7 @@ public sealed class EmailSenderUrlParsingTests [Fact] public void ParseUrl_WithRootPath_DoesNotOverrideVirtualHost() { - var defaultVHost = new RabbitMqConfiguration().VirtualHost; + var defaultVHost = new RabbitMqConnectionConfiguration().VirtualHost; var cfg = ParseUrl("amqp://broker:5672/", "user", "pass"); Assert.Equal(defaultVHost, cfg.VirtualHost); @@ -104,7 +104,7 @@ public sealed class EmailSenderUrlParsingTests [Fact] public void ParseUrl_WithoutPath_DoesNotOverrideVirtualHost() { - var defaultVHost = new RabbitMqConfiguration().VirtualHost; + var defaultVHost = new RabbitMqConnectionConfiguration().VirtualHost; var cfg = ParseUrl("amqp://broker:5672", "user", "pass"); Assert.Equal(defaultVHost, cfg.VirtualHost);