Workleap.Extensions.Configuration.Substitution
1.2.8
Prefix Reserved
See the version list below for details.
dotnet add package Workleap.Extensions.Configuration.Substitution --version 1.2.8
NuGet\Install-Package Workleap.Extensions.Configuration.Substitution -Version 1.2.8
<PackageReference Include="Workleap.Extensions.Configuration.Substitution" Version="1.2.8" />
<PackageVersion Include="Workleap.Extensions.Configuration.Substitution" Version="1.2.8" />
<PackageReference Include="Workleap.Extensions.Configuration.Substitution" />
paket add Workleap.Extensions.Configuration.Substitution --version 1.2.8
#r "nuget: Workleap.Extensions.Configuration.Substitution, 1.2.8"
#:package Workleap.Extensions.Configuration.Substitution@1.2.8
#addin nuget:?package=Workleap.Extensions.Configuration.Substitution&version=1.2.8
#tool nuget:?package=Workleap.Extensions.Configuration.Substitution&version=1.2.8
Workleap.Extensions.Configuration.Substitution
This package adds variable substitution configuration provider implementation for Microsoft.Extensions.Configuration.
Getting started
dotnet add package Workleap.Extensions.Configuration.Substitution
// Example for an ASP.NET Core web application
var builder = WebApplication.CreateBuilder(args);
// Setup your configuration
builder.Configuration.AddJsonFile("appsettings.json");
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddSubstitution(); // <-- Add this after other configuration providers
How it works
You can reference configuration values inside other configuration values by enclosing the referenced configuration key like this: ${ReferencedConfigurationKey}.
Examples
Consider this appsettings.json:
{
"Credentials": {
"Username": "alice1",
"Password": "P@ssw0rd"
},
"ConnectionString": "usr=${Credentials:Username};pwd=${Credentials:Password}"
}
Evaluating the configuration value ConnectionString would return usr=alice1;pwd=P@ssw0rd.
This also works if you're using multiple configuration providers. For instance, one could have the Credentials:Password configuration value provided by a secret from Azure Key Vault and this value would have been injected into the ConnectionString value too.
It also works with arrays:
{
"Credentials": [ "alice1", "P@ssw0rd" ],
"ConnectionString": "usr=${Credentials:0};pwd=${Credentials:1}"
}
Again, you're not limited to JSON file providers, you could use substitution with any configuration providers. It was easier to use JSON files in these examples.
Escaping values
You might not want a specific value to be substituted. In that case, escape it using double curly braces:
{
"Foo": "foo",
"Bar": "${{Foo}}"
}
Evaluating the configuration value Bar would return ${Foo}.
Exceptions
You can encounter two kinds of exceptions if your configuration is incorrect:
UnresolvedConfigurationKeyException, if you're trying to substitute a configuration value that is undefined (i.e. the key does not exist).RecursiveConfigurationKeyException, if you have many configuration values that reference each other in a recursive manner, no matter how deep the recursion is. The exception will give you details about the recursive path.
UnresolvedConfigurationKeyException can also be triggered sooner than later by using AddSubstitution(eagerValidation: true). Using eagerValidation with value true (default is false) instructs the library to check for undefined values in all the existing configuration values once, instead of checking for a particular value. This happens as soon as any configuration value is loaded.
Configuration providers order
When using .NET's IConfigurationBuilder, the order of configuration providers matters . Any configuration provider added after AddSubstitution() would not benefit from the substitution process.
License
Copyright © 2022, Workleap. This code is licensed under the Apache License, Version 2.0. You may obtain a copy of this license at https://github.com/workleap/gsoft-license/blob/master/LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.Configuration (>= 6.0.0)
-
net8.0
- Microsoft.Extensions.Configuration (>= 6.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.31-preview.2 | 32 | 2/12/2026 |
| 1.2.31-preview.1 | 39 | 2/9/2026 |
| 1.2.30 | 1,474 | 2/8/2026 |
| 1.2.30-preview.2 | 43 | 2/2/2026 |
| 1.2.30-preview.1 | 42 | 2/2/2026 |
| 1.2.29 | 2,938 | 2/1/2026 |
| 1.2.29-preview.1 | 43 | 1/26/2026 |
| 1.2.28 | 2,313 | 1/25/2026 |
| 1.2.28-preview.1 | 41 | 1/18/2026 |
| 1.2.27 | 2,321 | 1/18/2026 |
| 1.2.27-preview.3 | 41 | 1/17/2026 |
| 1.2.27-preview.2 | 47 | 1/16/2026 |
| 1.2.27-preview.1 | 46 | 1/12/2026 |
| 1.2.26 | 3,810 | 1/11/2026 |
| 1.2.26-preview.2 | 45 | 1/5/2026 |
| 1.2.26-preview.1 | 50 | 1/5/2026 |
| 1.2.25 | 7,216 | 1/4/2026 |
| 1.2.25-preview.2 | 54 | 12/30/2025 |
| 1.2.25-preview.1 | 51 | 12/29/2025 |
| 1.2.8 | 2,013 | 9/7/2025 |