An ASP .NET Core class library that provides access to application`s configuration stored in a database or any other repository.
- from NuGet;
- from package manager console:
Install-Package ConfigurationRepository
- from command line:
dotnet add package ConfigurationRepository
The configuration can be stored in two different structured forms, we have to choose one:
- A single configuration with it`s keys and values, like in a dictionary, this one called
DictionaryRepository. - Multiple configurations, one of which is extracted using the
Keyand aValuethat contains parsable hierarchical structure of the configuration by thatKey. This one calledParsableRepository.
Note
Currently, the only format supported for ParsableRepository is in JSON format. This can be easily extended implementing IConfigurationParser interface for any format needed.
A dictionary repository provider is registered by calling AddDictionaryRepository() extension method on configuration builder.
A parsable repository provider is registered by calling AddParsableRepository() extension method on configuration builder.
The main purpose of ConfigurationRepository is to store the configuration in a database. The following libraries provide this:
Dapper configuration repository - for accessing a database configuration using Dapper ORM.
using ConfigurationRepository;
using ConfigurationRepository.Dapper;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("Postgres");
builder.Configuration.AddDapperRepository(
repository => repository
.UseDbConnectionFactory(() => new NpgsqlConnection(connectionString))
.WithSelectConfigurationQuery("select \"Key\", \"Value\" from Configuration"));
var app = builder.Build();
app.Run();EntityFramework configuration repository - for accessing a database configuration using Entity Framework ORM.
using ConfigurationRepository.EntityFramework;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
var config = new ConfigurationBuilder()
.AddEfCoreRepository(options => options
.UseInMemoryDatabase("ConfigurationDatabase")
.UseTable("ConfigurationTable"))
.Build();SqlClient configuration repository - for accessing MS SQL Server database configuration using SqlClient library.
using ConfigurationRepository;
using ConfigurationRepository.SqlClient;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("MsSql");
builder.Configuration.AddSqlClientRepository(
repository => repository
.UseConnectionString(connectionString)
.WithConfigurationTableName("Configuration"));
var app = builder.Build();
app.Run();Dapper, EntityFramework and SqlClient repositories are all reloadable. Use Reloadable configuration repositories for building configurations that periodically updates from their source providers.
using ConfigurationRepository;
using ConfigurationRepository.Dapper;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("Postgres");
builder.Configuration.AddDapperRepository(
repository => repository
.UseDbConnectionFactory(() => new NpgsqlConnection(connectionString))
.WithSelectConfigurationQuery("select \"Key\", \"Value\" from Configuration")
.WithSelectCurrentVersionQuery("select max(\"Version\") from Configuration"),
source => source.WithPeriodicalReload());
builder.Services.AddConfigurationReloader();
var app = builder.Build();
app.Run();Parametrized configuration - for parametrizing configuration values
For example, this configuration described as a json:
{
"param1": "1+%param2%",
"param2": "2+%param3%",
"param3": "3"
}will be parametrized into this:
{
"param1": "1+2+3",
"param2": "2+3",
"param3": "3"
}That`s how we do it:
var configuration = new ConfigurationBuilder()
// ...Here will be listed all configuration providers (at least one)...
.WithParametrization() // Parametrized provider registered here as last one
.Build();We also may use environment variables over configuration parameters:
Environment.SetEnvironmentVariable("param3", "?");{
"param1": "1+2+?",
"param2": "2+?",
"param3": "3"
}