From 82be3c5a4f0b7921ad5202e66ca84426558009c2 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 2 Nov 2026 15:23:21 +0100 Subject: [PATCH] Refactor configuration handling Refactored `MessagingServiceApplicationConfiguration` to simplify the tracking of the LuckyPennySoft license key configuration by replacing the `_configured` tuple with a boolean. Removed email account configuration methods from this class. Updated `MessagingServiceInfrastructureConfiguration` to introduce a new `_configured` tuple for tracking `RabbitMqConnectionFactory` and `EmailAccounts` configurations. Added methods for configuring email accounts and updated the `EnsureRabbitMqConnectionFactoryAdded` method to include email account checks. Changed the namespace of `EmailAccountsOptions.cs` to `DigitalData.MessagingService.Infrastructure.Options`. Modified `Program.cs` to include email account configuration in the infrastructure setup. Added new files `DependencyInjectionExtensions.cs` and `MessagingServiceConfiguration.cs` as placeholders for future extensions, wrapped in `#if NET` directives. Removed an `` from `DigitalData.MessagingService.Infrastructure.csproj` and updated `DigitalData.MessagingService.Client.csproj` for XML compliance. --- ...essagingServiceApplicationConfiguration.cs | 39 ++----------------- ...ata.MessagingService.Infrastructure.csproj | 4 -- ...agingServiceInfrastructureConfiguration.cs | 31 ++++++++++++--- .../Options/EmailAccountsOptions.cs | 5 +-- .../Program.cs | 4 +- .../DependencyInjectionExtensions.cs | 10 +++++ .../MessagingServiceConfiguration.cs | 10 +++++ ...DigitalData.MessagingService.Client.csproj | 2 +- 8 files changed, 54 insertions(+), 51 deletions(-) rename src/{core/DigitalData.MessagingService.Application/Common => infrastructure/DigitalData.MessagingService.Infrastructure}/Options/EmailAccountsOptions.cs (79%) create mode 100644 src/presentation/DigitalData.MessagingService.Client/DependencyInjection/DependencyInjectionExtensions.cs create mode 100644 src/presentation/DigitalData.MessagingService.Client/DependencyInjection/MessagingServiceConfiguration.cs diff --git a/src/core/DigitalData.MessagingService.Application/DependencyInjection/MessagingServiceApplicationConfiguration.cs b/src/core/DigitalData.MessagingService.Application/DependencyInjection/MessagingServiceApplicationConfiguration.cs index ec82c2b..326ee91 100644 --- a/src/core/DigitalData.MessagingService.Application/DependencyInjection/MessagingServiceApplicationConfiguration.cs +++ b/src/core/DigitalData.MessagingService.Application/DependencyInjection/MessagingServiceApplicationConfiguration.cs @@ -1,5 +1,4 @@ #if NET -using DigitalData.MessagingService.Application.Common.Options; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -9,7 +8,7 @@ public partial class MessagingServiceApplicationConfiguration { private IServiceCollection Services { get; } - private (bool LuckyPennySoftLicenseKey, bool EmailAccounts) _configured = (LuckyPennySoftLicenseKey: false, EmailAccounts: false); + private bool _luckyPennySoftLicenseKeyAdded = false; internal MessagingServiceApplicationConfiguration(IServiceCollection services) { @@ -18,14 +17,10 @@ public partial class MessagingServiceApplicationConfiguration internal void EnsureConfigured() { - if (!_configured.LuckyPennySoftLicenseKey) + if (!_luckyPennySoftLicenseKeyAdded) { throw new InvalidOperationException("LuckyPennySoftLicenseKey is not configured. Please call SetLuckyPennySoftLicenseKey() or SetLuckyPennySoftLicenseKey(IConfiguration) in DI configuration."); } - if (!_configured.EmailAccounts) - { - throw new InvalidOperationException("EmailAccountsOptions is not configured. Please call ConfigureEmailAccountsOptions() or ConfigureEmailAccounts(IConfiguration) in DI configuration."); - } } #region LuckyPennySoftLicenseKey @@ -37,7 +32,7 @@ public partial class MessagingServiceApplicationConfiguration throw new InvalidOperationException("LuckyPennySoftLicenseKey is not configured. Please call SetLuckyPennySoftLicenseKey() or SetLuckyPennySoftLicenseKey(IConfiguration) in DI configuration."); LuckyPennySoftLicenseKey = licenseKey; - _configured.LuckyPennySoftLicenseKey = true; + _luckyPennySoftLicenseKeyAdded = true; return this; } @@ -46,33 +41,5 @@ public partial class MessagingServiceApplicationConfiguration return SetLuckyPennySoftLicenseKey(configuration.GetValue(key) ?? string.Empty); } #endregion LuckyPennySoftLicenseKey - - #region EmailAccountsOptions - /// - /// Ignores whether EmailAccountsOptions is configured or not. Use this method if you just want to publish messages to the messaging service; not to send - /// emails. If you want to consume the messaging service to send emails, you must configure EmailAccountsOptions using ConfigureEmailAccountsOptions() or - /// ConfigureEmailAccounts(IConfiguration). - /// - /// - public MessagingServiceApplicationConfiguration PublishOnly() - { - _configured.EmailAccounts = true; - return this; - } - - public MessagingServiceApplicationConfiguration ConfigureEmailAccountsOptions(Action configureOptions) - { - Services.Configure(configureOptions); - _configured.EmailAccounts = true; - return this; - } - - public MessagingServiceApplicationConfiguration ConfigureEmailAccounts(IConfiguration configuration, string sectionName = EmailAccountsOptions.SectionName) - { - Services.Configure(configuration.GetSection(sectionName)); - _configured.EmailAccounts = true; - return this; - } - #endregion EmailAccountsOptions } #endif \ No newline at end of file diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj index d7d6d9d..5dab655 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj @@ -38,8 +38,4 @@ - - - - diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/MessagingServiceInfrastructureConfiguration.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/MessagingServiceInfrastructureConfiguration.cs index b085f5d..0558aa6 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/MessagingServiceInfrastructureConfiguration.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/MessagingServiceInfrastructureConfiguration.cs @@ -1,4 +1,5 @@ -using DigitalData.MessagingService.RabbitMQ; +using DigitalData.MessagingService.Infrastructure.Options; +using DigitalData.MessagingService.RabbitMQ; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -8,7 +9,7 @@ public class MessagingServiceInfrastructureConfiguration { internal IServiceCollection Services { get; } - private bool _rabbitMqConnectionFactoryAdded = false; + private (bool RabbitMqConnectionFactory, bool EmailAccounts) _configured = (false, false); internal MessagingServiceInfrastructureConfiguration(IServiceCollection services) { @@ -17,24 +18,44 @@ public class MessagingServiceInfrastructureConfiguration public void EnsureRabbitMqConnectionFactoryAdded() { - if (!_rabbitMqConnectionFactoryAdded) + if (!_configured.RabbitMqConnectionFactory) { throw new InvalidOperationException("RabbitMQ connection factory has not been added. Please call AddRabbitMqConnectionFactory() before using this configuration."); } + if(!_configured.EmailAccounts) + { + throw new InvalidOperationException("Email accounts options have not been configured. Please call ConfigureEmailAccountsOptions() or ConfigureEmailAccounts() before using this configuration."); + } } public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(Action configure) { Services.AddRabbitMqConnectionFactory(configure); - _rabbitMqConnectionFactoryAdded = true; + _configured.RabbitMqConnectionFactory = true; return this; } public MessagingServiceInfrastructureConfiguration AddRabbitMqConnectionFactory(IConfiguration configuration, string sectionName = RabbitMqConfiguration.SectionName) { Services.AddRabbitMqConnectionFactory(configuration, sectionName); - _rabbitMqConnectionFactoryAdded = true; + _configured.RabbitMqConnectionFactory = true; return this; } + #region EmailAccountsOptions + public MessagingServiceInfrastructureConfiguration ConfigureEmailAccountsOptions(Action configureOptions) + { + Services.Configure(configureOptions); + _configured.EmailAccounts = true; + return this; + } + + public MessagingServiceInfrastructureConfiguration ConfigureEmailAccounts(IConfiguration configuration, string sectionName = EmailAccountsOptions.SectionName) + { + Services.Configure(configuration.GetSection(sectionName)); + _configured.EmailAccounts = true; + return this; + } + #endregion EmailAccountsOptions + } diff --git a/src/core/DigitalData.MessagingService.Application/Common/Options/EmailAccountsOptions.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Options/EmailAccountsOptions.cs similarity index 79% rename from src/core/DigitalData.MessagingService.Application/Common/Options/EmailAccountsOptions.cs rename to src/infrastructure/DigitalData.MessagingService.Infrastructure/Options/EmailAccountsOptions.cs index 6a86720..b786c30 100644 --- a/src/core/DigitalData.MessagingService.Application/Common/Options/EmailAccountsOptions.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Options/EmailAccountsOptions.cs @@ -1,10 +1,7 @@ #if NET -using DigitalData.MessagingService.Application.Common.Dto; using DigitalData.MessagingService.Application.Common.Dto.EmailAccounts; -using DigitalData.MessagingService.Application.EmailAccounts.Commands; -using DigitalData.MessagingService.Domain.Entities; -namespace DigitalData.MessagingService.Application.Common.Options; +namespace DigitalData.MessagingService.Infrastructure.Options; /// /// Wrapper options class that holds a list of entries diff --git a/src/presentation/DigitalData.MessagingService.API/Program.cs b/src/presentation/DigitalData.MessagingService.API/Program.cs index 779442d..4d58332 100644 --- a/src/presentation/DigitalData.MessagingService.API/Program.cs +++ b/src/presentation/DigitalData.MessagingService.API/Program.cs @@ -68,7 +68,9 @@ try builder.Services.AddMessagingServiceApplication(builder.Configuration); // Register Infrastructure layer (RabbitMQ, Repositories, etc.) - builder.Services.AddInfrastructure(cfg => cfg.AddRabbitMqConnectionFactory(builder.Configuration)); + builder.Services.AddInfrastructure(cfg => cfg + .AddRabbitMqConnectionFactory(builder.Configuration) + .ConfigureEmailAccounts(builder.Configuration)); // Health checks — each check corresponds to a singleton registered in the Infrastructure layer builder.Services.AddHealthChecks() diff --git a/src/presentation/DigitalData.MessagingService.Client/DependencyInjection/DependencyInjectionExtensions.cs b/src/presentation/DigitalData.MessagingService.Client/DependencyInjection/DependencyInjectionExtensions.cs new file mode 100644 index 0000000..bbeb71e --- /dev/null +++ b/src/presentation/DigitalData.MessagingService.Client/DependencyInjection/DependencyInjectionExtensions.cs @@ -0,0 +1,10 @@ +#if NET +namespace DigitalData.MessagingService.Client.DependencyInjection; + +/// +/// +/// +public static class DependencyInjectionExtensions +{ +} +#endif \ No newline at end of file diff --git a/src/presentation/DigitalData.MessagingService.Client/DependencyInjection/MessagingServiceConfiguration.cs b/src/presentation/DigitalData.MessagingService.Client/DependencyInjection/MessagingServiceConfiguration.cs new file mode 100644 index 0000000..cd78a1b --- /dev/null +++ b/src/presentation/DigitalData.MessagingService.Client/DependencyInjection/MessagingServiceConfiguration.cs @@ -0,0 +1,10 @@ +#if NET +namespace DigitalData.MessagingService.Client.DependencyInjection; + +/// +/// +/// +public class MessagingServiceConfiguration +{ +} +#endif \ No newline at end of file diff --git a/src/presentation/DigitalData.MessagingService.Client/DigitalData.MessagingService.Client.csproj b/src/presentation/DigitalData.MessagingService.Client/DigitalData.MessagingService.Client.csproj index 9a03590..03cfacd 100644 --- a/src/presentation/DigitalData.MessagingService.Client/DigitalData.MessagingService.Client.csproj +++ b/src/presentation/DigitalData.MessagingService.Client/DigitalData.MessagingService.Client.csproj @@ -61,7 +61,7 @@ - +