Skip to content
Merged
20 changes: 10 additions & 10 deletions Chapter-1-initial-architecture/Src/Fitnet/Fitnet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.35" />
<PackageReference Include="FluentValidation" Version="11.10.0" />
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="11.10.0" />
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
<PackageReference Include="MediatR" Version="12.4.1" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0-rc.2.24474.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.0-rc.2" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.0.0" />
<PackageReference Update="SonarAnalyzer.CSharp" Version="10.14.0.120626" />
<PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="FluentValidation" Version="12.0.0" />
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
<PackageReference Include="JetBrains.Annotations" Version="2025.2.2" />
<PackageReference Include="MediatR" Version="12.5.0" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.9" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.4" />
<PackageReference Update="SonarAnalyzer.CSharp" Version="10.15.0.120848" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<PackageReference Include="System.Text.Encodings.Web" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
<PackageReference Include="Microsoft.EntityFrameworkCore" />
<PackageReference Include="Npgsql" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
<PackageReference Include="System.Text.Encodings.Web" />
</ItemGroup>

<ItemGroup>
Expand Down
17 changes: 8 additions & 9 deletions Chapter-2-modules-separation/Src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,38 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup Label="Production">
<PackageVersion Include="MediatR" Version="12.5.0" />
<PackageVersion Include="Dapper" Version="2.1.66" />
<PackageVersion Include="FluentValidation" Version="12.0.0" />
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
<PackageVersion Include="JetBrains.Annotations" Version="2025.2.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.9" />
<PackageVersion Include="MediatR" Version="12.5.0" />
<PackageVersion Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.9" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.9" />
<PackageVersion Include="Npgsql" Version="9.0.3" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageVersion Include="System.Text.Encodings.Web" Version="9.0.9" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="9.0.4" />
</ItemGroup>
<ItemGroup Label="Tests">
<PackageVersion Include="Bogus" Version="35.6.3" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="9.9.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="Testcontainers" Version="4.7.0" />
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.7.0" />
<PackageVersion Include="Verify.Xunit" Version="30.17.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="xunit.analyzers" Version="1.24.0" />
<PackageVersion Include="xunit.categories" Version="2.0.8" />
<PackageVersion Include="Testcontainers" Version="4.7.0" />
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.7.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.9" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
</ItemGroup>
<ItemGroup>
<GlobalPackageReference Include="SonarAnalyzer.CSharp" Version="10.15.0.120848" PrivateAssets="all" Condition="$(MSBuildProjectExtension) == '.csproj'" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@
<PackageReference Include="Microsoft.EntityFrameworkCore" />
<PackageReference Include="Npgsql" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
<PackageReference Include="System.Text.Encodings.Web" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@
<PackageReference Include="Microsoft.EntityFrameworkCore" />
<PackageReference Include="Npgsql" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
<PackageReference Include="System.Text.Encodings.Web" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
<ItemGroup>
<PackageReference Include="Bogus" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Update="SonarAnalyzer.CSharp" />
<PackageReference Include="Shouldly" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ContractsPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<DatabaseOptions>(options => configuration.GetSection(DatabaseConfigurationSection).Bind(options));
services.AddDbContext<ContractsPersistence>((serviceProvider, options) =>
{
var databaseOptions = serviceProvider.GetRequiredService<IOptions<DatabaseOptions>>();
options.UseNpgsql(databaseOptions.Value.ConnectionString);
});
services.AddRepositories();

return services;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace EvolutionaryArchitecture.Fitnet.Contracts.Infrastructure.Database;

internal sealed class DatabaseOptions
{
public string? ConnectionString { get; init; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ internal sealed class ContractsDatabaseConfiguration : IDatabaseConfiguration

public Dictionary<string, string?> Get() => new()
{
{ "ConnectionStrings:Contracts", _connectionString }
{ "Database:ConnectionString", _connectionString }
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
"FeatureManagement": {
"Contracts": true,
},
"ConnectionStrings": {
"Contracts": ""
"Database": {
"ConnectionString": ""
},
"ExternalEventBus": {
"Uri": "localhost",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,8 @@
"Enabled": true
}
},
"ConnectionStrings": {
"Passes": "",
"Reports": "",
"Offers": ""
"Database": {
"ConnectionString": ""
},
"EventBus": {
"Uri": "localhost",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<OffersPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<DatabaseOptions>(_ => configuration.GetSection(DatabaseConfigurationSection));
services.AddDbContext<OffersPersistence>((serviceProvider, options) =>
{
var databaseOptions = serviceProvider.GetRequiredService<IOptions<DatabaseOptions>>();
options.UseNpgsql(databaseOptions.Value.ConnectionString);
});

return services;
}
Expand All @@ -23,4 +28,4 @@ internal static IApplicationBuilder UseDatabase(this IApplicationBuilder applica

return applicationBuilder;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace EvolutionaryArchitecture.Fitnet.Offers.DataAccess.Database;

internal sealed class DatabaseOptions
{
public string? ConnectionString { get; init; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ internal sealed class OffersDatabaseConfiguration : IDatabaseConfiguration

public Dictionary<string, string?> Get() => new()
{
{ "ConnectionStrings:Offers", _connectionString }
{ "Database:ConnectionString", _connectionString }
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<PassesPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<DatabaseOptions>(_ => configuration.GetSection(DatabaseConfigurationSection));
services.AddDbContext<PassesPersistence>((serviceProvider, options) =>
{
var databaseOptions = serviceProvider.GetRequiredService<IOptions<DatabaseOptions>>();
options.UseNpgsql(databaseOptions.Value.ConnectionString);
});

return services;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace EvolutionaryArchitecture.Fitnet.Passes.DataAccess.Database;

internal sealed class DatabaseOptions
{
public string? ConnectionString { get; init; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ internal sealed class PassesDatabaseConfiguration : IDatabaseConfiguration

public Dictionary<string, string?> Get() => new()
{
{ "ConnectionStrings:Passes", _connectionString }
{ "Database:ConnectionString", _connectionString }
};
}
Original file line number Diff line number Diff line change
@@ -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<DatabaseOptions>(options => configuration.GetSection(DatabaseConfigurationSection).Bind(options));
services.AddSingleton<IDatabaseConnectionFactory, DatabaseConnectionFactory>();

return services;
Expand Down
Original file line number Diff line number Diff line change
@@ -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> databaseOptions) : IDatabaseConnectionFactory
{
private NpgsqlConnection? _connection;

Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess;

internal sealed class DatabaseOptions
{
public string? ConnectionString { get; init; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static IServiceCollection AddReports(this IServiceCollection services, IC
return services;
}

services.AddDataAccess();
services.AddDataAccess(configuration);
services.AddNewPassesRegistrationsPerMonthReport();

return services;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ internal sealed class ReportsDatabaseConfiguration : IDatabaseConfiguration

public Dictionary<string, string?> Get() => new()
{
{ "ConnectionStrings:Passes", _connectionString },
{ "ConnectionStrings:Reports", _connectionString }
{ "Database:ConnectionString", _connectionString }
};
}