From adf6cac49a5d3513aa52589480e5e23361596b74 Mon Sep 17 00:00:00 2001 From: Andrija Stevanovic Date: Thu, 5 Feb 2026 20:53:24 +0100 Subject: [PATCH] infrastructure DI --- dotnet/AipsCore/AipsCore.csproj | 2 + .../DI/AipsRegistrationExtensions.cs | 19 +++++++++ .../ConfigurationEnvExtensions.cs | 25 +++++++++++ .../Configuration/ConfigurationException.cs | 9 ++++ .../DI/HandlerRegistrationExtensions.cs | 42 +++++++++++++++++++ .../DI/PersistenceRegistrationExtensions.cs | 20 +++++++++ 6 files changed, 117 insertions(+) create mode 100644 dotnet/AipsCore/Infrastructure/DI/AipsRegistrationExtensions.cs create mode 100644 dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationEnvExtensions.cs create mode 100644 dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationException.cs create mode 100644 dotnet/AipsCore/Infrastructure/DI/HandlerRegistrationExtensions.cs create mode 100644 dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs diff --git a/dotnet/AipsCore/AipsCore.csproj b/dotnet/AipsCore/AipsCore.csproj index 3f0347f..7b9524e 100644 --- a/dotnet/AipsCore/AipsCore.csproj +++ b/dotnet/AipsCore/AipsCore.csproj @@ -8,6 +8,8 @@ + + diff --git a/dotnet/AipsCore/Infrastructure/DI/AipsRegistrationExtensions.cs b/dotnet/AipsCore/Infrastructure/DI/AipsRegistrationExtensions.cs new file mode 100644 index 0000000..cc85caf --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/DI/AipsRegistrationExtensions.cs @@ -0,0 +1,19 @@ +using AipsCore.Application.Abstract; +using AipsCore.Application.Common.Dispatcher; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace AipsCore.Infrastructure.DI; + +public static class AipsRegistrationExtensions +{ + public static IServiceCollection AddAips(this IServiceCollection services, IConfiguration configuration) + { + services.AddHandlersFromAssembly(typeof(Dispatcher).Assembly); + services.AddSingleton(); + + services.AddPersistence(configuration); + + return services; + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationEnvExtensions.cs b/dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationEnvExtensions.cs new file mode 100644 index 0000000..69d8ec1 --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationEnvExtensions.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.Configuration; + +namespace AipsCore.Infrastructure.DI.Configuration; + +public static class ConfigurationEnvExtensions +{ + private const string DbConnStringKey = "DB_CONN_STRING"; + + public static string GetEnvConnectionString(this IConfiguration configuration) + { + return configuration.GetEnvForSure(DbConnStringKey); + } + + private static string GetEnvForSure(this IConfiguration configuration, string key) + { + var value = configuration[key]; + + if (value is null) + { + throw new ConfigurationException(key); + } + + return value; + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationException.cs b/dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationException.cs new file mode 100644 index 0000000..d031021 --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/DI/Configuration/ConfigurationException.cs @@ -0,0 +1,9 @@ +namespace AipsCore.Infrastructure.DI.Configuration; + +public class ConfigurationException : Exception +{ + public ConfigurationException(string key) + : base($"Env configuration error, key '{key}' not set.") + { + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/DI/HandlerRegistrationExtensions.cs b/dotnet/AipsCore/Infrastructure/DI/HandlerRegistrationExtensions.cs new file mode 100644 index 0000000..21caee5 --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/DI/HandlerRegistrationExtensions.cs @@ -0,0 +1,42 @@ +using System.Reflection; +using AipsCore.Application.Abstract.Command; +using AipsCore.Application.Abstract.Query; +using Microsoft.Extensions.DependencyInjection; + +namespace AipsCore.Infrastructure.DI; + +public static class HandlerRegistrationExtensions +{ + public static IServiceCollection AddHandlersFromAssembly(this IServiceCollection services, Assembly assembly) + { + var handlerInterfaces = new[] + { + typeof(ICommandHandler<>), + typeof(ICommandHandler<,>), + typeof(IQueryHandler<,>) + }; + + var types = assembly.GetTypes() + .Where(t => t is { IsAbstract: false, IsInterface: false }); + + foreach (var type in types) + { + var interfaces = type.GetInterfaces(); + + foreach (var @interface in interfaces) + { + if (!@interface.IsGenericType) + continue; + + var genericDef = @interface.GetGenericTypeDefinition(); + + if (!handlerInterfaces.Contains(genericDef)) + continue; + + services.AddScoped(@interface, type); + } + } + + return services; + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs b/dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs new file mode 100644 index 0000000..04e6578 --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs @@ -0,0 +1,20 @@ +using AipsCore.Infrastructure.DI.Configuration; +using AipsCore.Infrastructure.Persistence.Db; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace AipsCore.Infrastructure.DI; + +public static class PersistenceRegistrationExtensions +{ + public static IServiceCollection AddPersistence(this IServiceCollection services, IConfiguration configuration) + { + services.AddDbContext(options => + { + options.UseNpgsql(configuration.GetEnvConnectionString()); + }); + + return services; + } +} \ No newline at end of file