Changes on config and DI

This commit is contained in:
2026-03-19 17:22:27 +01:00
parent d1fd6fb9a0
commit 23852709cb
9 changed files with 134 additions and 9 deletions
@@ -0,0 +1,35 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace Musify.Application.Configuration
{
public static class ConfigurationDependencyInjection
{
public static IServiceCollection AddApplicationConfigurations(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{
serviceDescriptors
.AddValidatedConfiguration<StorageConfiguration>(configuration, StorageConfiguration.SectionName)
.AddValidatedConfiguration<PlayListConfiguration>(configuration, PlayListConfiguration.SectionName);
return serviceDescriptors;
}
static IServiceCollection AddValidatedConfiguration<TConfiguration>(
this IServiceCollection serviceDescriptors,
IConfiguration configuration,
string sectionName)
where TConfiguration : class
{
serviceDescriptors
.AddOptionsWithValidateOnStart<TConfiguration>()
.Bind(configuration.GetRequiredSection(sectionName))
.ValidateDataAnnotations();
serviceDescriptors.AddSingleton(serviceProvider =>
serviceProvider.GetRequiredService<IOptions<TConfiguration>>().Value);
return serviceDescriptors;
}
}
}
@@ -0,0 +1,35 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace Musify.Infrastructure.Configuration
{
public static class ConfigurationDependencyInjection
{
public static IServiceCollection AddInfrastructureConfigurations(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{
serviceDescriptors
.AddValidatedConfiguration<DatabaseConfiguration>(configuration, DatabaseConfiguration.SectionName)
.AddValidatedConfiguration<KeycloakConfiguration>(configuration, KeycloakConfiguration.SectionName);
return serviceDescriptors;
}
static IServiceCollection AddValidatedConfiguration<TConfiguration>(
this IServiceCollection serviceDescriptors,
IConfiguration configuration,
string sectionName)
where TConfiguration : class
{
serviceDescriptors
.AddOptionsWithValidateOnStart<TConfiguration>()
.Bind(configuration.GetRequiredSection(sectionName))
.ValidateDataAnnotations();
serviceDescriptors.AddSingleton(serviceProvider =>
serviceProvider.GetRequiredService<IOptions<TConfiguration>>().Value);
return serviceDescriptors;
}
}
}
@@ -8,10 +8,10 @@ namespace Musify.Infrastructure.Identity
{ {
public static class KeycloakDependencyInjection public static class KeycloakDependencyInjection
{ {
public static void AddKeycloakAuthentication(this IServiceCollection serviceDescriptors, IConfiguration configuration) public static IServiceCollection AddKeycloakAuthentication(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{ {
var keycloakConfiguration = serviceDescriptors.AddOptionsWithValidateOnStart<KeycloakConfiguration>() serviceDescriptors.AddOptionsWithValidateOnStart<KeycloakConfiguration>()
.Bind(configuration) .Bind(configuration.GetRequiredSection(KeycloakConfiguration.SectionName))
.ValidateDataAnnotations(); .ValidateDataAnnotations();
serviceDescriptors.AddScoped(serviceProvider => serviceDescriptors.AddScoped(serviceProvider =>
@@ -24,6 +24,7 @@ namespace Musify.Infrastructure.Identity
keycloakConfiguration.Password); keycloakConfiguration.Password);
} ); } );
serviceDescriptors.AddScoped<IKeycloakUserClient, KeycloakIdentityService>(); serviceDescriptors.AddScoped<IKeycloakUserClient, KeycloakIdentityService>();
return serviceDescriptors;
} }
} }
} }
@@ -0,0 +1,42 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Musify.Application.Contracts.Infrastructure;
using Musify.Infrastructure.Configuration;
using Musify.Infrastructure.Identity;
using Musify.Infrastructure.Messaging;
using Musify.Infrastructure.Persistence;
using Musify.Infrastructure.Pictures;
using Musify.Infrastructure.Storage;
namespace Musify.Infrastructure
{
public static class InfrastructureDependencyInjection
{
public static IServiceCollection AddInfrastructureModules(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{
serviceDescriptors
.AddInfrastructureConfigurations(configuration)
.AddDatabase(configuration)
.AddKeycloakAuthentication(configuration)
.AddStorageHandler()
.AddPictureHandler()
.AddMassTransitClient(configuration)
.AddScoped<IEventBus, MassTransitEventBus>();
return serviceDescriptors;
}
public static IServiceCollection AddInfrastructureWorkerModules(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{
serviceDescriptors
.AddInfrastructureConfigurations(configuration)
.AddDatabase(configuration)
.AddStorageHandler()
.AddPictureHandler()
.AddMassTransitConsumers(configuration)
.AddScoped<IEventBus, MassTransitEventBus>();
return serviceDescriptors;
}
}
}
@@ -7,7 +7,7 @@ namespace Musify.Infrastructure.Messaging
{ {
public static class MassTransitDependencyInjection public static class MassTransitDependencyInjection
{ {
public static void AddMassTransitClient(this IServiceCollection serviceDescriptors, IConfiguration configuration) public static IServiceCollection AddMassTransitClient(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{ {
serviceDescriptors.AddMassTransit(options => serviceDescriptors.AddMassTransit(options =>
{ {
@@ -31,9 +31,10 @@ namespace Musify.Infrastructure.Messaging
} ); } );
} ); } );
} ); } );
return serviceDescriptors;
} }
public static void AddMassTransitConsumers(this IServiceCollection serviceDescriptors, IConfiguration configuration) public static IServiceCollection AddMassTransitConsumers(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{ {
serviceDescriptors.AddMassTransit(options => serviceDescriptors.AddMassTransit(options =>
{ {
@@ -69,6 +70,8 @@ namespace Musify.Infrastructure.Messaging
} ); } );
} ); } );
} ); } );
return serviceDescriptors;
} }
} }
} }
@@ -6,10 +6,12 @@ namespace Musify.Infrastructure.Persistence
{ {
public static class DatabaseDependencyInjection public static class DatabaseDependencyInjection
{ {
public static void AddDatabase(this IServiceCollection serviceDescriptors, IConfiguration configuration) public static IServiceCollection AddDatabase(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{ {
serviceDescriptors.AddDbContext<Database>(); serviceDescriptors.AddDbContext<Database>();
serviceDescriptors.AddScoped<IDatabase>(serviceProvider => serviceProvider.GetRequiredService<Database>()); serviceDescriptors.AddScoped<IDatabase>(serviceProvider => serviceProvider.GetRequiredService<Database>());
return serviceDescriptors;
} }
} }
} }
@@ -14,7 +14,11 @@ namespace Musify.Infrastructure.Persistence
.AddJsonFile("DesignSettings.json") .AddJsonFile("DesignSettings.json")
.AddUserSecrets<DatabaseDesignTimeFactory>() .AddUserSecrets<DatabaseDesignTimeFactory>()
.Build(); .Build();
var databaseConfiguration = DatabaseConfiguration.Load(configuration);
var databaseConfiguration = configuration
.GetRequiredSection(DatabaseConfiguration.SectionName)
.Get<DatabaseConfiguration>()
?? throw new InvalidOperationException($"{DatabaseConfiguration.SectionName} configuration section not found.");
var optionsBuilder = new DbContextOptionsBuilder<Database>(); var optionsBuilder = new DbContextOptionsBuilder<Database>();
optionsBuilder.UseNpgsql(databaseConfiguration.ConnectionString); optionsBuilder.UseNpgsql(databaseConfiguration.ConnectionString);
@@ -5,9 +5,10 @@ namespace Musify.Infrastructure.Pictures
{ {
public static class PictureDependencyInjection public static class PictureDependencyInjection
{ {
public static void AddPictureHandler(this IServiceCollection serviceDescriptors) public static IServiceCollection AddPictureHandler(this IServiceCollection serviceDescriptors)
{ {
serviceDescriptors.AddScoped<IPictureHandler, PictureHandler>(); serviceDescriptors.AddScoped<IPictureHandler, PictureHandler>();
return serviceDescriptors;
} }
} }
} }
@@ -7,7 +7,7 @@ namespace Musify.Infrastructure.Storage
{ {
public static class StorageDependencyInjection public static class StorageDependencyInjection
{ {
public static void AddStorageHandler(this IServiceCollection serviceDescriptors) public static IServiceCollection AddStorageHandler(this IServiceCollection serviceDescriptors)
{ {
serviceDescriptors.AddScoped<IAmazonS3>(serviceProvider => serviceDescriptors.AddScoped<IAmazonS3>(serviceProvider =>
{ {
@@ -22,6 +22,8 @@ namespace Musify.Infrastructure.Storage
} ); } );
serviceDescriptors.AddScoped<IStorageHandler, StorageHandler>(); serviceDescriptors.AddScoped<IStorageHandler, StorageHandler>();
return serviceDescriptors;
} }
} }
} }