Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace EvolutionaryArchitecture.Fitnet.Contracts.Data.Database;

using System.ComponentModel.DataAnnotations;

internal sealed class ContractsPersistenceOptions
{
public const string SectionName = "ConnectionStrings";

[Required] public string Contracts { get; init; } = string.Empty;
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
namespace EvolutionaryArchitecture.Fitnet.Contracts.Data.Database;

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;

internal static class DatabaseModule
{
private const string ConnectionStringName = "Contracts";

internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
{
var connectionString = configuration.GetConnectionString(ConnectionStringName);
services.AddDbContext<ContractsPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<ContractsPersistenceOptions>(
configuration.GetSection(ContractsPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<ContractsPersistenceOptions>();

services.AddDbContext<ContractsPersistence>((serviceProvider, options) =>
{
var persistenceOptions = serviceProvider.GetRequiredService<IOptions<ContractsPersistenceOptions>>();
var connectionString = persistenceOptions.Value.Contracts;
options.UseNpgsql(connectionString);
});

return services;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
namespace EvolutionaryArchitecture.Fitnet.Offers.Data.Database;

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;

internal static class DatabaseModule
{
private const string ConnectionStringName = "Offers";

internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
{
var connectionString = configuration.GetConnectionString(ConnectionStringName);
services.AddDbContext<OffersPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<OffersPersistenceOptions>(configuration.GetSection(OffersPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<OffersPersistenceOptions>();

services.AddDbContext<OffersPersistence>((serviceProvider, options) =>
{
var persistenceOptions = serviceProvider.GetRequiredService<IOptions<OffersPersistenceOptions>>();
var connectionString = persistenceOptions.Value.Offers;
options.UseNpgsql(connectionString);
});

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

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

using System.ComponentModel.DataAnnotations;

internal sealed class OffersPersistenceOptions
{
public const string SectionName = "ConnectionStrings";

[Required] public string Offers { get; init; } = string.Empty;
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
namespace EvolutionaryArchitecture.Fitnet.Passes.Data.Database;

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;

internal static class DatabaseModule
{
private const string ConnectionStringName = "Passes";

internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
{
var connectionString = configuration.GetConnectionString(ConnectionStringName);
services.AddDbContext<PassesPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<PassesPersistenceOptions>(configuration.GetSection(PassesPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<PassesPersistenceOptions>();

services.AddDbContext<PassesPersistence>((serviceProvider, options) =>
{
var persistenceOptions = serviceProvider.GetRequiredService<IOptions<PassesPersistenceOptions>>();
var connectionString = persistenceOptions.Value.Passes;
options.UseNpgsql(connectionString);
});

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

using System.ComponentModel.DataAnnotations;

internal sealed class PassesPersistenceOptions
{
public const string SectionName = "ConnectionStrings";

[Required] public string Passes { get; init; } = string.Empty;
}
2 changes: 1 addition & 1 deletion Chapter-1-initial-architecture/Src/Fitnet/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
builder.Services.AddPasses(builder.Configuration);
builder.Services.AddContracts(builder.Configuration);
builder.Services.AddOffers(builder.Configuration);
builder.Services.AddReports();
builder.Services.AddReports(builder.Configuration);

await using var app = builder.Build();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess;

internal static class DataAccessModule
{
internal static IServiceCollection AddDataAccess(this IServiceCollection services, IConfiguration configuration)
{
services.Configure<ReportsPersistenceOptions>(configuration.GetSection(ReportsPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<ReportsPersistenceOptions>();

services.AddScoped<IDatabaseConnectionFactory, DatabaseConnectionFactory>();

return services;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess;

using System.ComponentModel.DataAnnotations;

internal sealed class ReportsPersistenceOptions
{
public const string SectionName = "ConnectionStrings";

[Required] public string Reports { get; init; } = string.Empty;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ namespace EvolutionaryArchitecture.Fitnet.Reports;

internal static class ReportsModule
{
internal static IServiceCollection AddReports(this IServiceCollection services)
internal static IServiceCollection AddReports(this IServiceCollection services, IConfiguration configuration)
{
services.AddDataAccess();
services.AddDataAccess(configuration);
services.AddNewPassesRegistrationsPerMonthReport();

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

using System.ComponentModel.DataAnnotations;

internal sealed class ContractsPersistenceOptions
{
public const string SectionName = "Modules:Contracts:ConnectionStrings";

[Required]
public string Primary { get; init; } = string.Empty;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,23 @@ 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 ConnectionStringConfigurationSection = "Modules:Contracts:ConnectionStrings:Primary";

internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
{
var connectionString = configuration.GetSection(ConnectionStringConfigurationSection).Value;
services.AddDbContext<ContractsPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<ContractsPersistenceOptions>(configuration.GetSection(ContractsPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<ContractsPersistenceOptions>();

services.AddDbContext<ContractsPersistence>((serviceProvider, options) =>
{
var persistenceOptions = serviceProvider.GetRequiredService<IOptions<ContractsPersistenceOptions>>();
var connectionString = persistenceOptions.Value.Primary;
options.UseNpgsql(connectionString);
});

services.AddRepositories();

return services;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,21 @@ 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 ConnectionStringConfigurationSection = "Modules:Offers:ConnectionStrings:Primary";

internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
{
var connectionString = configuration.GetSection(ConnectionStringConfigurationSection).Value;
services.AddDbContext<OffersPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<OffersPersistenceOptions>(configuration.GetSection(OffersPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<OffersPersistenceOptions>();

services.AddDbContext<OffersPersistence>((serviceProvider, options) =>
{
var persistenceOptions = serviceProvider.GetRequiredService<IOptions<OffersPersistenceOptions>>();
var connectionString = persistenceOptions.Value.Primary;
options.UseNpgsql(connectionString);
});

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

using System.ComponentModel.DataAnnotations;

internal sealed class OffersPersistenceOptions
{
public const string SectionName = "Modules:Offers:ConnectionStrings";

[Required]
public string Primary { get; init; } = string.Empty;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,21 @@ 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 ConnectionStringConfigurationSection = "Modules:Passes:ConnectionStrings:Primary";

internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
{
var connectionString = configuration.GetRequiredSection(ConnectionStringConfigurationSection).Value;
services.AddDbContext<PassesPersistence>(options => options.UseNpgsql(connectionString));
services.Configure<PassesPersistenceOptions>(configuration.GetSection(PassesPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<PassesPersistenceOptions>();

services.AddDbContext<PassesPersistence>((serviceProvider, options) =>
{
var persistenceOptions = serviceProvider.GetRequiredService<IOptions<PassesPersistenceOptions>>();
var connectionString = persistenceOptions.Value.Primary;
options.UseNpgsql(connectionString);
});

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

using System.ComponentModel.DataAnnotations;

internal sealed class PassesPersistenceOptions
{
public const string SectionName = "Modules:Passes:ConnectionStrings";

[Required]
public string Primary { get; init; } = string.Empty;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess;

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

internal static class DatabaseAccessModule
{
internal static IServiceCollection AddDataAccess(this IServiceCollection services)
internal static IServiceCollection AddDataAccess(this IServiceCollection services, IConfiguration configuration)
{
services.Configure<ReportsPersistenceOptions>(configuration.GetSection(ReportsPersistenceOptions.SectionName));
services.AddOptionsWithValidateOnStart<ReportsPersistenceOptions>();

services.AddSingleton<IDatabaseConnectionFactory, DatabaseConnectionFactory>();

return services;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess;

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using System.Data;
using System.Diagnostics.CodeAnalysis;
using Npgsql;

internal sealed class DatabaseConnectionFactory(IConfiguration configuration) : IDatabaseConnectionFactory
internal sealed class DatabaseConnectionFactory(IOptions<ReportsPersistenceOptions> persistenceOptions) : IDatabaseConnectionFactory
{
private const string ConnectionStringConfigurationSection = "Modules:Reports:ConnectionStrings:Primary";
private NpgsqlConnection? _connection;

public IDbConnection Create()
Expand All @@ -17,9 +16,8 @@ public IDbConnection Create()
return _connection;
}

var connectionString = configuration.GetRequiredSection(ConnectionStringConfigurationSection).Value;
_connection =
new NpgsqlConnection(connectionString);
var connectionString = persistenceOptions.Value.Primary;
_connection = new NpgsqlConnection(connectionString);
_connection.Open();

return _connection;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace EvolutionaryArchitecture.Fitnet.Reports.DataAccess;

using System.ComponentModel.DataAnnotations;

internal sealed class ReportsPersistenceOptions
{
public const string SectionName = "Modules:Reports:ConnectionStrings";

[Required]
public string Primary { get; init; } = string.Empty;
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static IServiceCollection AddReports(this IServiceCollection services, st
return services;
}

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

return services;
Expand Down