NetLah.Extensions.Configuration is a library which contains a set of reusable classes for build configuration with environment. These library classes are ConfigurationBuilderBuilder, CertificateLoader and ConnectionStringManager.
ConsoleApp
public static void Main(string[] args)
{
var configuration = ConfigurationBuilderBuilder.Create<Program>(args).Build();
var defaultConnectionString = configuration.GetConnectionString("DefaultConnection");
Console.WriteLine($"[TRACE] ConnectionString: {defaultConnectionString}");
}Full API support
var initConfig = new ConfigurationBuilder().Build();
IConfigurationRoot configuration = new ConfigurationBuilderBuilder()
.WithConfiguration(initConfig)
.WithInMemory(new Dictionary<string, string?>{ ["Key:Sub"] = "Value" })
.WithBasePath("C:/App/bin")
.WithCurrentDirectory()
.WithBaseDirectory()
.WithAppSecrets<Program>()
.WithAppSecrets(typeof(Program).Assembly)
.WithAddConfiguration(cb => cb.AddIniFile("appsettings.ini", optional: true, reloadOnChange: true))
.WithEnvironment("Staging")
.WithCommandLines(args)
.Build();- Reference
https://devblogs.microsoft.com/premier-developer/order-of-precedence-when-configuring-asp-net-core/
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/#default-configuration
- Order of Precedence
- Host configuration from environment variables by prefix
DOTNET_andASPNETCORE_ - Chanined configuration (if any)
- In memory configuration (if any)
- appsettings.json using the JSON configuration provider
- appsettings.EnvironmentName.json using the JSON configuration provider
- Other extra configuration sources
- App secrets when the app runs in the
Developmentenvironment - Environment variables using the Environment Variables configuration provider
- Command-line arguments using the Command-line configuration provider
The application binary folder is default basePath for appsettings.json, appsettings.Production.json,etc. In case want to change current directory as basePath:
var configuration = new ConfigurationBuilderBuilder()
.WithCurrentDirectory()
.Build();ConfigurationBuilderBuilder will detect EnvironmentName by add configuration environment variables with prefix DOTNET_ and ASPNETCORE_. If no environment variable set, Production will use by default. Example of environment variables:
ASPNETCORE_ENVIRONMENT = Development
DOTNET_ENVIRONMENT = StagingSometime, we cannot set the environmentName using environment variable, or we need different environment configuration build lik in unit test project, we can specific the environmentName.
var configuration = ConfigurationBuilderBuilder.Create<ConfigurationBuilderBuilderTest>()
.WithEnvironment("Testing")
.Build();var configuration = ConfigurationBuilderBuilder.Create<Program>()
.WithAddConfiguration(cb => cb.AddIniFile("appsettings.ini", optional: true, reloadOnChange: true))
.WithAddConfiguration(cb => cb.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true))
.Build();Or
var configuration = ConfigurationBuilderBuilder.Create<Program>()
.WithAddConfiguration(
cb => cb.AddIniFile("appsettings.ini", optional: true, reloadOnChange: true)
.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true)
)
.Build();Reference at https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?#connection-string-prefixes
public enum DbProviders
{
Custom,
SQLServer,
PostgreSQL,
MySQL,
}List of supported provider name
SQLServer
Mssql
SQLAzure
System.Data.SqlClient
Microsoft.Data.SqlClient
MySQL
MySql.Data.MySqlClient
MySqlConnector
PostgreSQL
Npgsql
Postgres
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=dbname;Integrated Security=True;",
"DefaultConnection_ProviderName": "System.Data.SqlClient",
"BlogConnection": "AccountEndpoint=https://7d48.documents.azure.com:443/;",
"BlogConnection_ProviderName": "Cosmos1",
"BlogConnection2_Cosmos": "AccountEndpoint=https://7d48.documents.azure.com:443/;"
}
}IConfiguration configuration;
var connStrManager = new ConnectionStringManager(configuration);
var conn = connStrManager["defaultConnection"];
if (conn != null) {
if (conn.Provider == DbProviders.PostgreSQL) {
...
} else if (conn.Provider == DbProviders.MySQL) {
...
} else if (conn.Provider == DbProviders.SQLServer) {
...
} else if (conn.Provider == DbProviders.Custom && conn.Custom == "Cosmos1") {
...
}
}var conn = connStrManager["BlogConnection", "BlogConnection2"];
if (conn != null) {
if (conn.Provider == DbProviders.Custom && conn.Custom == "Cosmos1") {
...
} else if (conn.Provider == DbProviders.Custom && conn.Custom == "Cosmos") {
...
}
}Use docker for troubleshooting