From 22b494a2624053e14b71d90ef07d2ea935091652 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 3 Nov 2025 08:44:22 +0100 Subject: [PATCH] refactor(di): unify Application and Infrastructure DI registrations under a central method - Added central AddEnvelopeGenerator extension to aggregate existing DI setups - Introduced EGConfiguration for modular service registration - Standardized configuration pattern for Application and Infrastructure layers - Simplified distributed cache and localization registration --- .../DependencyInjection.cs | 3 + EnvelopeGenerator.BBTests/frmFinalizePDF.vb | 2 +- .../FinalizeDocument/FinalizeDocumentJob.vb | 2 +- .../DependencyInjection.cs | 63 ++++++++++++++++++- ...velopeGenerator.DependencyInjection.csproj | 7 +++ EnvelopeGenerator.Finalizer/Program.cs | 2 +- EnvelopeGenerator.GeneratorAPI/Program.cs | 2 +- .../DependencyInjection.cs | 8 +-- .../20250701151754_InitialCreate.Designer.cs | 2 +- .../Migrations/EGDbContextModelSnapshot.cs | 2 +- EnvelopeGenerator.Web/Program.cs | 9 +-- 11 files changed, 82 insertions(+), 20 deletions(-) diff --git a/EnvelopeGenerator.Application/DependencyInjection.cs b/EnvelopeGenerator.Application/DependencyInjection.cs index 4238bc39..59b44347 100644 --- a/EnvelopeGenerator.Application/DependencyInjection.cs +++ b/EnvelopeGenerator.Application/DependencyInjection.cs @@ -61,6 +61,9 @@ public static class DependencyInjection // Add memory cache services.AddMemoryCache(); + // Register mail services + services.AddScoped(); + return services; } } \ No newline at end of file diff --git a/EnvelopeGenerator.BBTests/frmFinalizePDF.vb b/EnvelopeGenerator.BBTests/frmFinalizePDF.vb index e6466c73..62e6b9ef 100644 --- a/EnvelopeGenerator.BBTests/frmFinalizePDF.vb +++ b/EnvelopeGenerator.BBTests/frmFinalizePDF.vb @@ -32,7 +32,7 @@ Public Class frmFinalizePDF #Disable Warning BC40000 ' Type or member is obsolete Factory.Shared _ .BehaveOnPostBuild(PostBuildBehavior.Ignore) _ - .AddEnvelopeGeneratorInfrastructureServices( + .AddEGInfrastructureServices( Sub(opt) opt.AddDbTriggerParams( Sub(triggers) diff --git a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb index 554a5b91..5c091ceb 100644 --- a/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb +++ b/EnvelopeGenerator.CommonServices/Jobs/FinalizeDocument/FinalizeDocumentJob.vb @@ -72,7 +72,7 @@ Namespace Jobs #Disable Warning BC40000 ' Type or member is obsolete Factory.Shared _ .BehaveOnPostBuild(PostBuildBehavior.Ignore) _ - .AddEnvelopeGeneratorInfrastructureServices( + .AddEGInfrastructureServices( Sub(opt) opt.AddDbTriggerParams( Sub(triggers) diff --git a/EnvelopeGenerator.DependencyInjection/DependencyInjection.cs b/EnvelopeGenerator.DependencyInjection/DependencyInjection.cs index 4449c5b4..e4122c60 100644 --- a/EnvelopeGenerator.DependencyInjection/DependencyInjection.cs +++ b/EnvelopeGenerator.DependencyInjection/DependencyInjection.cs @@ -1,11 +1,70 @@ -using Microsoft.Extensions.DependencyInjection; +using DigitalData.EmailProfilerDispatcher; +using DigitalData.UserManager.DependencyInjection; +using EnvelopeGenerator.Application; +using EnvelopeGenerator.Infrastructure; +using Microsoft.Extensions.Caching.SqlServer; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using static EnvelopeGenerator.Infrastructure.DependencyInjection; namespace EnvelopeGenerator.DependencyInjection; public static class DependencyInjection { - public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services) + public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfiguration config, Action options, Action distributedCacheOptions) { + var egConfig = new EGConfiguration(); + options.Invoke(egConfig); + egConfig.RegisterAll(services); + + // Add envelope generator services +#pragma warning disable CS0618 + services.AddUserManager(); +#pragma warning restore CS0618 + + services.AddDispatcher(); + return services; } + + public record EGConfiguration + { + internal readonly Queue> ServiceRegs = new(); + + internal void RegisterAll(IServiceCollection services) + { + while (ServiceRegs.Count > 0) + ServiceRegs.Dequeue().Invoke(services); + } + + public EGConfiguration AddLocalization() + { + ServiceRegs.Enqueue(s => s.AddLocalization()); + return this; + } + + public EGConfiguration AddDistributedSqlServerCache(Action setupAction) + { + ServiceRegs.Enqueue(s => s.AddDistributedSqlServerCache(setupAction)); + return this; + } + + public EGConfiguration AddInfrastructure(Action options) + { +#pragma warning disable CS0618 + ServiceRegs.Enqueue(s => s.AddEGInfrastructureServices(options)); +#pragma warning restore CS0618 + return this; + } + + public IConfiguration Configuration + { + set + { +#pragma warning disable CS0618 + ServiceRegs.Enqueue(s => s.AddEnvelopeGeneratorServices(value)); +#pragma warning restore CS0618 + } + } + } } \ No newline at end of file diff --git a/EnvelopeGenerator.DependencyInjection/EnvelopeGenerator.DependencyInjection.csproj b/EnvelopeGenerator.DependencyInjection/EnvelopeGenerator.DependencyInjection.csproj index 37465c66..82b95b81 100644 --- a/EnvelopeGenerator.DependencyInjection/EnvelopeGenerator.DependencyInjection.csproj +++ b/EnvelopeGenerator.DependencyInjection/EnvelopeGenerator.DependencyInjection.csproj @@ -7,7 +7,14 @@ + + + + + + + diff --git a/EnvelopeGenerator.Finalizer/Program.cs b/EnvelopeGenerator.Finalizer/Program.cs index 117a95da..7bda308b 100644 --- a/EnvelopeGenerator.Finalizer/Program.cs +++ b/EnvelopeGenerator.Finalizer/Program.cs @@ -28,7 +28,7 @@ try ?? throw new InvalidOperationException($"Connection string '{cnnStrName}' is missing in the application configuration."); #pragma warning disable CS0618 // Type or member is obsolete - builder.Services.AddEnvelopeGeneratorInfrastructureServices( + builder.Services.AddEGInfrastructureServices( opt => { opt.AddDbTriggerParams(config); diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 3579ae72..3813ede4 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -185,7 +185,7 @@ try // Envelope generator serives #pragma warning disable CS0618 // Type or member is obsolete builder.Services - .AddEnvelopeGeneratorInfrastructureServices(opt => + .AddEGInfrastructureServices(opt => { opt.AddDbTriggerParams(config); opt.AddDbContext((provider, options) => diff --git a/EnvelopeGenerator.Infrastructure/DependencyInjection.cs b/EnvelopeGenerator.Infrastructure/DependencyInjection.cs index 587ea312..6feca190 100644 --- a/EnvelopeGenerator.Infrastructure/DependencyInjection.cs +++ b/EnvelopeGenerator.Infrastructure/DependencyInjection.cs @@ -38,10 +38,10 @@ namespace EnvelopeGenerator.Infrastructure /// will be created per HTTP request (or per scope) within the dependency injection container. /// [Obsolete("Use IRepository")] - public static IServiceCollection AddEnvelopeGeneratorInfrastructureServices(this IServiceCollection services, Action options) + public static IServiceCollection AddEGInfrastructureServices(this IServiceCollection services, Action options) { // configure custom options - options(new Config(services)); + options(new EGInfrastructureConfiguration(services)); #if NET services.TryAddScoped(); services.TryAddScoped(); @@ -160,11 +160,11 @@ namespace EnvelopeGenerator.Infrastructure } #endif - public class Config + public class EGInfrastructureConfiguration { private readonly IServiceCollection _services; - internal Config(IServiceCollection services) + internal EGInfrastructureConfiguration(IServiceCollection services) { _services = services; } diff --git a/EnvelopeGenerator.Infrastructure/Migrations/20250701151754_InitialCreate.Designer.cs b/EnvelopeGenerator.Infrastructure/Migrations/20250701151754_InitialCreate.Designer.cs index cedf6e60..9e7168c0 100644 --- a/EnvelopeGenerator.Infrastructure/Migrations/20250701151754_InitialCreate.Designer.cs +++ b/EnvelopeGenerator.Infrastructure/Migrations/20250701151754_InitialCreate.Designer.cs @@ -525,7 +525,7 @@ namespace EnvelopeGenerator.Infrastructure.Migrations }); }); - modelBuilder.Entity("EnvelopeGenerator.Domain.Entities.Config", b => + modelBuilder.Entity("EnvelopeGenerator.Domain.Entities.EGInfrastructureConfiguration", b => { b.Property("ExportPath") .HasColumnType("nvarchar(256)") diff --git a/EnvelopeGenerator.Infrastructure/Migrations/EGDbContextModelSnapshot.cs b/EnvelopeGenerator.Infrastructure/Migrations/EGDbContextModelSnapshot.cs index 3f38a335..8c7f42a4 100644 --- a/EnvelopeGenerator.Infrastructure/Migrations/EGDbContextModelSnapshot.cs +++ b/EnvelopeGenerator.Infrastructure/Migrations/EGDbContextModelSnapshot.cs @@ -522,7 +522,7 @@ namespace EnvelopeGenerator.Infrastructure.Migrations }); }); - modelBuilder.Entity("EnvelopeGenerator.Domain.Entities.Config", b => + modelBuilder.Entity("EnvelopeGenerator.Domain.Entities.EGInfrastructureConfiguration", b => { b.Property("ExportPath") .HasColumnType("nvarchar(256)") diff --git a/EnvelopeGenerator.Web/Program.cs b/EnvelopeGenerator.Web/Program.cs index 61c11a5f..91aaa99c 100644 --- a/EnvelopeGenerator.Web/Program.cs +++ b/EnvelopeGenerator.Web/Program.cs @@ -1,4 +1,3 @@ -using EnvelopeGenerator.Application.Services; using Microsoft.EntityFrameworkCore; using NLog; using Quartz; @@ -16,7 +15,6 @@ using EnvelopeGenerator.Web.Sanitizers; using EnvelopeGenerator.Web.Models.Annotation; using DigitalData.UserManager.DependencyInjection; using EnvelopeGenerator.Web.Middleware; -using EnvelopeGenerator.Application.Common.Interfaces.Services; var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger(); logger.Info("Logging initialized!"); @@ -103,7 +101,7 @@ try // Add envelope generator services #pragma warning disable CS0618 // Type or member is obsolete - builder.Services.AddEnvelopeGeneratorInfrastructureServices( + builder.Services.AddEGInfrastructureServices( opt => { opt.AddDbTriggerParams(config); @@ -186,11 +184,6 @@ try builder.Services.Configure(config.GetSection("Cultures")); builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); - // Register mail services -#pragma warning disable CS0618 // Type or member is obsolete - builder.Services.AddScoped(); -#pragma warning restore CS0618 // Type or member is obsolete - builder.Services.AddDispatcher(); builder.ConfigureBySection();