feat: introduce AppSettings per application

- AppSettings class in Api and Worker with SectionName constant
- appsettings.json: replaced ConnectionStrings section with App section
- Program.cs: bind AppSettings at startup, register as singleton
- Connection string now sourced from AppSettings.ConnectionString

Ref: IT-628

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Anatolii Grynchuk
2026-05-02 00:30:19 +03:00
parent 1dccd9f5f7
commit 4ea57b2068
6 changed files with 32 additions and 12 deletions
@@ -0,0 +1,8 @@
namespace HrynCo.NotificationService.Api;
public sealed class AppSettings
{
public const string SectionName = "App";
public string ConnectionString { get; init; } = string.Empty;
}
+7 -5
View File
@@ -1,3 +1,4 @@
using HrynCo.NotificationService.Api;
using HrynCo.NotificationService.DAL.EF; using HrynCo.NotificationService.DAL.EF;
using HrynCo.NotificationService.Services; using HrynCo.NotificationService.Services;
using Serilog; using Serilog;
@@ -7,13 +8,14 @@ var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((context, lc) => builder.Host.UseSerilog((context, lc) =>
lc.ReadFrom.Configuration(context.Configuration)); lc.ReadFrom.Configuration(context.Configuration));
var appSettings = builder.Configuration
.GetSection(AppSettings.SectionName)
.Get<AppSettings>() ?? throw new InvalidOperationException("App settings are not configured.");
builder.Services.AddSingleton(appSettings);
builder.Services.AddOpenApi(); builder.Services.AddOpenApi();
builder.Services.AddControllers(); builder.Services.AddControllers();
builder.Services.AddNotificationDataAccess(appSettings.ConnectionString);
string connectionString = builder.Configuration.GetConnectionString("Default")
?? throw new InvalidOperationException("Connection string 'Default' is not configured.");
builder.Services.AddNotificationDataAccess(connectionString);
builder.Services.AddNotificationServices(); builder.Services.AddNotificationServices();
var app = builder.Build(); var app = builder.Build();
@@ -1,6 +1,6 @@
{ {
"ConnectionStrings": { "App": {
"Default": "Host=localhost;Port=5432;Database=notification_service;Username=postgres;Password=postgres" "ConnectionString": "Host=localhost;Port=5432;Database=notification_service;Username=postgres;Password=postgres"
}, },
"Serilog": { "Serilog": {
"MinimumLevel": { "MinimumLevel": {
@@ -0,0 +1,8 @@
namespace HrynCo.NotificationService.Worker;
public sealed class AppSettings
{
public const string SectionName = "App";
public string ConnectionString { get; init; } = string.Empty;
}
+5 -3
View File
@@ -8,10 +8,12 @@ var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddSerilog(lc => builder.Services.AddSerilog(lc =>
lc.ReadFrom.Configuration(builder.Configuration)); lc.ReadFrom.Configuration(builder.Configuration));
string connectionString = builder.Configuration.GetConnectionString("Default") var appSettings = builder.Configuration
?? throw new InvalidOperationException("Connection string 'Default' is not configured."); .GetSection(AppSettings.SectionName)
.Get<AppSettings>() ?? throw new InvalidOperationException("App settings are not configured.");
builder.Services.AddNotificationDataAccess(connectionString); builder.Services.AddSingleton(appSettings);
builder.Services.AddNotificationDataAccess(appSettings.ConnectionString);
builder.Services.AddNotificationServices(); builder.Services.AddNotificationServices();
builder.Services.AddHostedService<Worker>(); builder.Services.AddHostedService<Worker>();
@@ -1,6 +1,6 @@
{ {
"ConnectionStrings": { "App": {
"Default": "Host=localhost;Port=5432;Database=notification_service;Username=postgres;Password=postgres" "ConnectionString": "Host=localhost;Port=5432;Database=notification_service;Username=postgres;Password=postgres"
}, },
"Serilog": { "Serilog": {
"MinimumLevel": { "MinimumLevel": {