Skip to content

Commit ea5c957

Browse files
authored
Apply options pattern for database connection strings to Chapter 4
1 parent e2567a4 commit ea5c957

File tree

15 files changed

+92
-26
lines changed

15 files changed

+92
-26
lines changed

Chapter-4-applying-tactical-domain-driven-design/Fitnet.Contracts/Src/Fitnet.Contracts.Infrastructure/Database/DatabaseModule.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,21 @@ namespace EvolutionaryArchitecture.Fitnet.Contracts.Infrastructure.Database;
44
using Microsoft.EntityFrameworkCore;
55
using Microsoft.Extensions.Configuration;
66
using Microsoft.Extensions.DependencyInjection;
7+
using Microsoft.Extensions.Options;
78
using Repositories;
89

910
internal static class DatabaseModule
1011
{
11-
private const string ConnectionStringName = "Contracts";
12+
private const string DatabaseConfigurationSection = "Database";
1213

1314
internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
1415
{
15-
var connectionString = configuration.GetConnectionString(ConnectionStringName);
16-
services.AddDbContext<ContractsPersistence>(options => options.UseNpgsql(connectionString));
16+
services.Configure<DatabaseOptions>(options => configuration.GetSection(DatabaseConfigurationSection).Bind(options));
17+
services.AddDbContext<ContractsPersistence>((serviceProvider, options) =>
18+
{
19+
var databaseOptions = serviceProvider.GetRequiredService<IOptions<DatabaseOptions>>();
20+
options.UseNpgsql(databaseOptions.Value.ConnectionString);
21+
});
1722
services.AddRepositories();
1823

1924
return services;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace EvolutionaryArchitecture.Fitnet.Contracts.Infrastructure.Database;
2+
3+
internal sealed class DatabaseOptions
4+
{
5+
public string? ConnectionString { get; init; }
6+
}

Chapter-4-applying-tactical-domain-driven-design/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.Development.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
"FeatureManagement": {
99
"Contracts": true,
1010
},
11-
"ConnectionStrings": {
12-
"Contracts": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword"
11+
"Database": {
12+
"ConnectionString": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword"
1313
},
1414
"EventBus": {
1515
"Uri": "rabbitmq",

Chapter-4-applying-tactical-domain-driven-design/Fitnet.Contracts/Src/Fitnet.Contracts/appsettings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
}
77
},
88
"AllowedHosts": "*",
9-
"ConnectionStrings": {
10-
"Contracts": ""
9+
"Database": {
10+
"ConnectionString": ""
1111
},
1212
"ExternalEventBus": {
1313
"Uri": "localhost",

Chapter-4-applying-tactical-domain-driven-design/Fitnet.Contracts/Src/nuget.config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@
1313
<activePackageSource>
1414
<add key="All" value="(Aggregate source)" />
1515
</activePackageSource>
16+
<disabledPackageSources>
17+
<add key="evolutionaryArchitecture" value="true" />
18+
</disabledPackageSources>
1619
</configuration>

Chapter-4-applying-tactical-domain-driven-design/Fitnet/Src/Fitnet/appsettings.Development.json

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,20 @@
1111
"Passes": true,
1212
"Reports": true
1313
},
14-
"ConnectionStrings": {
15-
"Passes": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword",
16-
"Reports": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword",
17-
"Offers": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword"
14+
"Passes": {
15+
"Database": {
16+
"ConnectionString": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword"
17+
}
18+
},
19+
"Reports": {
20+
"Database": {
21+
"ConnectionString": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword"
22+
}
23+
},
24+
"Offers": {
25+
"Database": {
26+
"ConnectionString": "Host=postgres:5432;Database=fitnet;Username=postgres;Password=mysecretpassword"
27+
}
1828
},
1929
"EventBus": {
2030
"Uri": "rabbitmq",

Chapter-4-applying-tactical-domain-driven-design/Fitnet/Src/Fitnet/appsettings.json

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,20 @@
1717
"Enabled": true
1818
}
1919
},
20-
"ConnectionStrings": {
21-
"Passes": "",
22-
"Reports": "",
23-
"Offers": ""
20+
"Passes": {
21+
"Database": {
22+
"ConnectionString": ""
23+
}
24+
},
25+
"Reports": {
26+
"Database": {
27+
"ConnectionString": ""
28+
}
29+
},
30+
"Offers": {
31+
"Database": {
32+
"ConnectionString": ""
33+
}
2434
},
2535
"EventBus": {
2636
"Uri": "localhost",

Chapter-4-applying-tactical-domain-driven-design/Fitnet/Src/Offers/Fitnet.Offers.DataAccess/Database/DatabaseModule.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@ namespace EvolutionaryArchitecture.Fitnet.Offers.DataAccess.Database;
44
using Microsoft.EntityFrameworkCore;
55
using Microsoft.Extensions.Configuration;
66
using Microsoft.Extensions.DependencyInjection;
7+
using Microsoft.Extensions.Options;
78

89
internal static class DatabaseModule
910
{
10-
private const string ConnectionStringName = "Offers";
11+
private const string DatabaseConfigurationSection = "Offers:Database";
1112

1213
internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
1314
{
14-
var connectionString = configuration.GetConnectionString(ConnectionStringName);
15-
services.AddDbContext<OffersPersistence>(options => options.UseNpgsql(connectionString));
15+
services.Configure<DatabaseOptions>(_ => configuration.GetSection(DatabaseConfigurationSection));
16+
services.AddDbContext<OffersPersistence>((serviceProvider, options) =>
17+
{
18+
var databaseOptions = serviceProvider.GetRequiredService<IOptions<DatabaseOptions>>();
19+
options.UseNpgsql(databaseOptions.Value.ConnectionString);
20+
});
1621

1722
return services;
1823
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace EvolutionaryArchitecture.Fitnet.Offers.DataAccess.Database;
2+
3+
internal sealed class DatabaseOptions
4+
{
5+
public string? ConnectionString { get; init; }
6+
}

Chapter-4-applying-tactical-domain-driven-design/Fitnet/Src/Passes/Fitnet.Passes.DataAccess/Database/DatabaseModule.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@ namespace EvolutionaryArchitecture.Fitnet.Passes.DataAccess.Database;
44
using Microsoft.EntityFrameworkCore;
55
using Microsoft.Extensions.Configuration;
66
using Microsoft.Extensions.DependencyInjection;
7+
using Microsoft.Extensions.Options;
78

89
internal static class DatabaseModule
910
{
10-
private const string ConnectionStringName = "Passes";
11+
private const string DatabaseConfigurationSection = "Passes:Database";
1112

1213
internal static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
1314
{
14-
var connectionString = configuration.GetConnectionString(ConnectionStringName);
15-
services.AddDbContext<PassesPersistence>(options => options.UseNpgsql(connectionString));
15+
services.Configure<DatabaseOptions>(_ => configuration.GetSection(DatabaseConfigurationSection));
16+
services.AddDbContext<PassesPersistence>((serviceProvider, options) =>
17+
{
18+
var databaseOptions = serviceProvider.GetRequiredService<IOptions<DatabaseOptions>>();
19+
options.UseNpgsql(databaseOptions.Value.ConnectionString);
20+
});
1621

1722
return services;
1823
}

0 commit comments

Comments
 (0)