diff --git a/Chapter-1-initial-architecture/Src/Fitnet/Fitnet.csproj b/Chapter-1-initial-architecture/Src/Fitnet/Fitnet.csproj index 68d69e8c..97e62fae 100644 --- a/Chapter-1-initial-architecture/Src/Fitnet/Fitnet.csproj +++ b/Chapter-1-initial-architecture/Src/Fitnet/Fitnet.csproj @@ -5,16 +5,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/Chapter-2-modules-separation/Src/Common/Fitnet.Common.Infrastructure/Fitnet.Common.Infrastructure.csproj b/Chapter-2-modules-separation/Src/Common/Fitnet.Common.Infrastructure/Fitnet.Common.Infrastructure.csproj index 50290313..5b76a24f 100644 --- a/Chapter-2-modules-separation/Src/Common/Fitnet.Common.Infrastructure/Fitnet.Common.Infrastructure.csproj +++ b/Chapter-2-modules-separation/Src/Common/Fitnet.Common.Infrastructure/Fitnet.Common.Infrastructure.csproj @@ -8,7 +8,6 @@ - diff --git a/Chapter-2-modules-separation/Src/Contracts/Fitnet.Contracts.Infrastructure/Fitnet.Contracts.Infrastructure.csproj b/Chapter-2-modules-separation/Src/Contracts/Fitnet.Contracts.Infrastructure/Fitnet.Contracts.Infrastructure.csproj index a7bca2e8..3cac8ac0 100644 --- a/Chapter-2-modules-separation/Src/Contracts/Fitnet.Contracts.Infrastructure/Fitnet.Contracts.Infrastructure.csproj +++ b/Chapter-2-modules-separation/Src/Contracts/Fitnet.Contracts.Infrastructure/Fitnet.Contracts.Infrastructure.csproj @@ -10,7 +10,6 @@ - diff --git a/Chapter-2-modules-separation/Src/Directory.Packages.props b/Chapter-2-modules-separation/Src/Directory.Packages.props index 07da22c9..6f76a4a9 100644 --- a/Chapter-2-modules-separation/Src/Directory.Packages.props +++ b/Chapter-2-modules-separation/Src/Directory.Packages.props @@ -3,14 +3,14 @@ true - - + + @@ -18,24 +18,23 @@ - + - + + + + + - - - - - diff --git a/Chapter-2-modules-separation/Src/Offers/Fitnet.Offers.DataAccess/Fitnet.Offers.DataAccess.csproj b/Chapter-2-modules-separation/Src/Offers/Fitnet.Offers.DataAccess/Fitnet.Offers.DataAccess.csproj index 2aac0088..4f356b36 100644 --- a/Chapter-2-modules-separation/Src/Offers/Fitnet.Offers.DataAccess/Fitnet.Offers.DataAccess.csproj +++ b/Chapter-2-modules-separation/Src/Offers/Fitnet.Offers.DataAccess/Fitnet.Offers.DataAccess.csproj @@ -7,6 +7,5 @@ - \ No newline at end of file diff --git a/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Fitnet.Passes.DataAccess.csproj b/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Fitnet.Passes.DataAccess.csproj index 1e9f63c1..5f2c3f8a 100644 --- a/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Fitnet.Passes.DataAccess.csproj +++ b/Chapter-2-modules-separation/Src/Passes/Fitnet.Passes.DataAccess/Fitnet.Passes.DataAccess.csproj @@ -7,6 +7,5 @@ - \ No newline at end of file diff --git a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj index 3e18a25c..9e0fe877 100644 --- a/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj +++ b/Chapter-2-modules-separation/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/Fitnet.Reports.IntegrationTests.csproj @@ -7,7 +7,6 @@ - diff --git a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseModule.cs b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseModule.cs index ed3c788a..76104b7a 100644 --- a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseModule.cs +++ b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseModule.cs @@ -4,16 +4,21 @@ namespace EvolutionaryArchitecture.Fitnet.Contracts.Infrastructure.Database; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Repositories; internal static class DatabaseModule { - private const string ConnectionStringName = "Contracts"; + private const string DatabaseConfigurationSection = "Database"; internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration) { - var connectionString = configuration.GetConnectionString(ConnectionStringName); - services.AddDbContext(options => options.UseNpgsql(connectionString)); + services.Configure(options => configuration.GetSection(DatabaseConfigurationSection).Bind(options)); + services.AddDbContext((serviceProvider, options) => + { + var databaseOptions = serviceProvider.GetRequiredService>(); + options.UseNpgsql(databaseOptions.Value.ConnectionString); + }); services.AddRepositories(); return services; diff --git a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseOptions.cs b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseOptions.cs new file mode 100644 index 00000000..ac02e05f --- /dev/null +++ b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseOptions.cs @@ -0,0 +1,6 @@ +namespace EvolutionaryArchitecture.Fitnet.Contracts.Infrastructure.Database; + +internal sealed class DatabaseOptions +{ + public string? ConnectionString { get; init; } +} \ No newline at end of file diff --git a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.IntegrationTests/ContractsDatabaseConfiguration.cs b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.IntegrationTests/ContractsDatabaseConfiguration.cs index 818e9a19..4da91e44 100644 --- a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.IntegrationTests/ContractsDatabaseConfiguration.cs +++ b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts.IntegrationTests/ContractsDatabaseConfiguration.cs @@ -10,6 +10,6 @@ internal sealed class ContractsDatabaseConfiguration : IDatabaseConfiguration public Dictionary Get() => new() { - { "ConnectionStrings:Contracts", _connectionString } + { "Database:ConnectionString", _connectionString } }; } diff --git a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.Development.json b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.Development.json index 534a0365..dcc35bd9 100644 --- a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.Development.json +++ b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.Development.json @@ -8,8 +8,8 @@ "FeatureManagement": { "Contracts": true, }, - "ConnectionStrings": { - "Contracts": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword" + "Database": { + "ConnectionString": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword" }, "EventBus": { "Uri": "rabbitmq", diff --git a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.json b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.json index 37b231db..45c1e4c2 100644 --- a/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.json +++ b/Chapter-3-microservice-extraction/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.json @@ -9,8 +9,8 @@ "FeatureManagement": { "Contracts": true, }, - "ConnectionStrings": { - "Contracts": "" + "Database": { + "ConnectionString": "" }, "ExternalEventBus": { "Uri": "localhost", diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.Development.json b/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.Development.json index bdcefcd1..30ed3b57 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.Development.json +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.Development.json @@ -11,10 +11,8 @@ "Passes": true, "Reports": true }, - "ConnectionStrings": { - "Passes": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword", - "Reports": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword", - "Offers": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword" + "Database": { + "ConnectionString": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword" }, "EventBus": { "Uri": "rabbitmq", diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.json b/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.json index 89456cd1..4b1beae0 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.json +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Fitnet/appsettings.json @@ -17,10 +17,8 @@ "Enabled": true } }, - "ConnectionStrings": { - "Passes": "", - "Reports": "", - "Offers": "" + "Database": { + "ConnectionString": "" }, "EventBus": { "Uri": "localhost", diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseModule.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseModule.cs index f7165a94..32ff1f2b 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseModule.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseModule.cs @@ -4,15 +4,20 @@ namespace EvolutionaryArchitecture.Fitnet.Offers.DataAccess.Database; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; internal static class DatabaseModule { - private const string ConnectionStringName = "Offers"; + private const string DatabaseConfigurationSection = "Database"; internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration) { - var connectionString = configuration.GetConnectionString(ConnectionStringName); - services.AddDbContext(options => options.UseNpgsql(connectionString)); + services.Configure(_ => configuration.GetSection(DatabaseConfigurationSection)); + services.AddDbContext((serviceProvider, options) => + { + var databaseOptions = serviceProvider.GetRequiredService>(); + options.UseNpgsql(databaseOptions.Value.ConnectionString); + }); return services; } @@ -23,4 +28,4 @@ internal static IApplicationBuilder UseDatabase(this IApplicationBuilder applica return applicationBuilder; } -} \ No newline at end of file +} diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseOptions.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseOptions.cs new file mode 100644 index 00000000..6c4ff042 --- /dev/null +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseOptions.cs @@ -0,0 +1,6 @@ +namespace EvolutionaryArchitecture.Fitnet.Offers.DataAccess.Database; + +internal sealed class DatabaseOptions +{ + public string? ConnectionString { get; init; } +} \ No newline at end of file diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/OffersDatabaseConfiguration.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/OffersDatabaseConfiguration.cs index d366eced..3525f5d1 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/OffersDatabaseConfiguration.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Offers/Tests/Fitnet.Offers.IntegrationTests/OffersDatabaseConfiguration.cs @@ -10,6 +10,6 @@ internal sealed class OffersDatabaseConfiguration : IDatabaseConfiguration public Dictionary Get() => new() { - { "ConnectionStrings:Offers", _connectionString } + { "Database:ConnectionString", _connectionString } }; } diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseModule.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseModule.cs index fcf9f43e..6b209efa 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseModule.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseModule.cs @@ -4,15 +4,20 @@ namespace EvolutionaryArchitecture.Fitnet.Passes.DataAccess.Database; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; internal static class DatabaseModule { - private const string ConnectionStringName = "Passes"; + private const string DatabaseConfigurationSection = "Database"; internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration) { - var connectionString = configuration.GetConnectionString(ConnectionStringName); - services.AddDbContext(options => options.UseNpgsql(connectionString)); + services.Configure(_ => configuration.GetSection(DatabaseConfigurationSection)); + services.AddDbContext((serviceProvider, options) => + { + var databaseOptions = serviceProvider.GetRequiredService>(); + options.UseNpgsql(databaseOptions.Value.ConnectionString); + }); return services; } diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseOptions.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseOptions.cs new file mode 100644 index 00000000..fe8f892c --- /dev/null +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseOptions.cs @@ -0,0 +1,6 @@ +namespace EvolutionaryArchitecture.Fitnet.Passes.DataAccess.Database; + +internal sealed class DatabaseOptions +{ + public string? ConnectionString { get; init; } +} \ No newline at end of file diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/PassesDatabaseConfiguration.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/PassesDatabaseConfiguration.cs index 17742270..6f637948 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/PassesDatabaseConfiguration.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Passes/Tests/Fitnet.Passes.IntegrationTests/PassesDatabaseConfiguration.cs @@ -10,6 +10,6 @@ internal sealed class PassesDatabaseConfiguration : IDatabaseConfiguration public Dictionary Get() => new() { - { "ConnectionStrings:Passes", _connectionString } + { "Database:ConnectionString", _connectionString } }; } diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseAccessModule.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseAccessModule.cs index 4778dc9d..e48e1074 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseAccessModule.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseAccessModule.cs @@ -1,11 +1,15 @@ namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; internal static class DatabaseAccessModule { - internal static IServiceCollection AddDataAccess(this IServiceCollection services) + private const string DatabaseConfigurationSection = "Database"; + + internal static IServiceCollection AddDataAccess(this IServiceCollection services, IConfiguration configuration) { + services.Configure(options => configuration.GetSection(DatabaseConfigurationSection).Bind(options)); services.AddSingleton(); return services; diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseConnectionFactory.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseConnectionFactory.cs index 3e786ab5..6215cd0a 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseConnectionFactory.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseConnectionFactory.cs @@ -1,10 +1,10 @@ namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess; -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; using System.Data; using Npgsql; -internal sealed class DatabaseConnectionFactory(IConfiguration configuration) : IDatabaseConnectionFactory +internal sealed class DatabaseConnectionFactory(IOptions databaseOptions) : IDatabaseConnectionFactory { private NpgsqlConnection? _connection; @@ -15,8 +15,7 @@ public IDbConnection Create() return _connection; } - _connection = - new NpgsqlConnection(configuration.GetConnectionString("Reports")); + _connection = new NpgsqlConnection(databaseOptions.Value.ConnectionString); _connection.Open(); return _connection; diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseOptions.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseOptions.cs new file mode 100644 index 00000000..5219b1a8 --- /dev/null +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/DataAccess/DatabaseOptions.cs @@ -0,0 +1,6 @@ +namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess; + +internal sealed class DatabaseOptions +{ + public string? ConnectionString { get; init; } +} \ No newline at end of file diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/ReportsModule.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/ReportsModule.cs index f4379226..df24c753 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/ReportsModule.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Fitnet.Reports/ReportsModule.cs @@ -27,7 +27,7 @@ public static IServiceCollection AddReports(this IServiceCollection services, IC return services; } - services.AddDataAccess(); + services.AddDataAccess(configuration); services.AddNewPassesRegistrationsPerMonthReport(); return services; diff --git a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/ReportsDatabaseConfiguration.cs b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/ReportsDatabaseConfiguration.cs index a5d34f87..2b9aaa3d 100644 --- a/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/ReportsDatabaseConfiguration.cs +++ b/Chapter-3-microservice-extraction/Fitnet/Src/Reports/Tests/Fitnet.Reports.IntegrationTests/ReportsDatabaseConfiguration.cs @@ -10,7 +10,6 @@ internal sealed class ReportsDatabaseConfiguration : IDatabaseConfiguration public Dictionary Get() => new() { - { "ConnectionStrings:Passes", _connectionString }, - { "ConnectionStrings:Reports", _connectionString } + { "Database:ConnectionString", _connectionString } }; }