Workleap.Extensions.Configuration.Substitution 1.1.3

Prefix Reserved
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package Workleap.Extensions.Configuration.Substitution --version 1.1.3                
NuGet\Install-Package Workleap.Extensions.Configuration.Substitution -Version 1.1.3                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Workleap.Extensions.Configuration.Substitution" Version="1.1.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Workleap.Extensions.Configuration.Substitution --version 1.1.3                
#r "nuget: Workleap.Extensions.Configuration.Substitution, 1.1.3"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Workleap.Extensions.Configuration.Substitution as a Cake Addin
#addin nuget:?package=Workleap.Extensions.Configuration.Substitution&version=1.1.3

// Install Workleap.Extensions.Configuration.Substitution as a Cake Tool
#tool nuget:?package=Workleap.Extensions.Configuration.Substitution&version=1.1.3                

Workleap.Extensions.Configuration.Substitution

This package adds variable substitution configuration provider implementation for Microsoft.Extensions.Configuration.

nuget build

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/gsoft-inc/gsoft-license/blob/master/LICENSE.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  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 was computed.  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. 
.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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.1.4-preview.13 43 12/18/2024
1.1.4-preview.12 57 11/29/2024
1.1.4-preview.11 41 11/24/2024
1.1.4-preview.10 41 11/16/2024
1.1.4-preview.9 42 10/31/2024
1.1.4-preview.8 44 10/30/2024
1.1.4-preview.7 46 10/28/2024
1.1.4-preview.6 43 10/28/2024
1.1.4-preview.5 45 10/28/2024
1.1.4-preview.4 44 10/7/2024
1.1.4-preview.3 48 10/1/2024
1.1.4-preview.2 49 9/30/2024
1.1.4-preview.1 58 9/27/2024
1.1.3 13,108 9/23/2024
1.1.3-preview.48 52 9/20/2024
1.1.3-preview.47 55 9/13/2024
1.1.3-preview.46 55 8/27/2024
1.1.3-preview.45 48 8/27/2024
1.1.3-preview.44 52 8/27/2024
1.1.3-preview.43 44 8/27/2024
1.1.3-preview.42 65 8/16/2024
1.1.3-preview.41 50 7/30/2024
1.1.3-preview.40 69 7/18/2024
1.1.3-preview.39 51 7/18/2024
1.1.3-preview.38 46 7/5/2024
1.1.3-preview.37 58 5/31/2024
1.1.3-preview.36 54 5/31/2024
1.1.3-preview.35 57 5/21/2024
1.1.3-preview.34 64 5/10/2024
1.1.3-preview.33 53 5/3/2024
1.1.3-preview.32 123 4/15/2024
1.1.3-preview.31 76 4/12/2024
1.1.3-preview.30 65 4/3/2024
1.1.3-preview.29 67 4/3/2024
1.1.3-preview.28 64 3/8/2024
1.1.3-preview.27 65 3/7/2024
1.1.3-preview.26 64 3/4/2024
1.1.3-preview.25 68 3/1/2024
1.1.3-preview.24 66 2/16/2024
1.1.3-preview.23 65 2/12/2024
1.1.3-preview.22 78 2/6/2024
1.1.3-preview.21 66 2/6/2024
1.1.3-preview.20 66 1/22/2024
1.1.3-preview.19 65 1/12/2024
1.1.3-preview.18 60 1/12/2024
1.1.3-preview.17 57 1/12/2024
1.1.3-preview.16 82 12/18/2023
1.1.3-preview.15 96 11/26/2023
1.1.3-preview.14 84 11/17/2023
1.1.3-preview.13 68 11/13/2023
1.1.3-preview.12 147 11/6/2023
1.1.3-preview.11 81 10/30/2023
1.1.3-preview.10 81 10/20/2023
1.1.3-preview.9 82 10/17/2023
1.1.3-preview.8 82 10/13/2023
1.1.3-preview.7 82 9/26/2023
1.1.3-preview.6 76 9/25/2023
1.1.3-preview.5 69 9/21/2023
1.1.3-preview.4 71 9/20/2023
1.1.3-preview.3 76 9/20/2023
1.1.3-preview.2 72 9/20/2023
1.1.3-preview.1 89 8/9/2023
1.1.2 78,211 7/20/2023
1.1.2-preview.20 88 7/20/2023