CatConsult.AppConfigConfigurationProvider
2.5.1
dotnet add package CatConsult.AppConfigConfigurationProvider --version 2.5.1
NuGet\Install-Package CatConsult.AppConfigConfigurationProvider -Version 2.5.1
<PackageReference Include="CatConsult.AppConfigConfigurationProvider" Version="2.5.1" />
paket add CatConsult.AppConfigConfigurationProvider --version 2.5.1
#r "nuget: CatConsult.AppConfigConfigurationProvider, 2.5.1"
// Install CatConsult.AppConfigConfigurationProvider as a Cake Addin #addin nuget:?package=CatConsult.AppConfigConfigurationProvider&version=2.5.1 // Install CatConsult.AppConfigConfigurationProvider as a Cake Tool #tool nuget:?package=CatConsult.AppConfigConfigurationProvider&version=2.5.1
AWS AppConfig Configuration Provider for .NET
An opinionated .NET Configuration Provider for AWS AppConfig.
This configuration provider supports the following freeform configuration profile type formats:
- JSON
- YAML
This provider also supports the Feature Flag configuration profile type and renders .NET FeatureManagement-compatible configuration. Please refer to the Feature Flag section below for more information.
Usage
First, download the provider from NuGet:
dotnet add package CatConsult.AppConfigConfigurationProvider
Then add the provider using the AddAppConfig
extension method:
builder.Configuration.AddAppConfig();
By default, the provider will look for a configuration section named AppConfig
.
This can be overriden by specifying a different section name:
builder.Configuration.AddAppConfig("MyCustomName");
Configuration
The provider requires some minimal configuration in order for it to know which AppConfig profiles to load:
{
"AppConfig": {
"Profiles": [
"abc1234:def5678:ghi9123",
"q2w3e25:po92j45:bt9s090:300"
]
}
}
As you can see in the example above, the AppConfig metadata are encoded as a formatted string:
ApplicationId:EnvironmentId:ProfileId[:ReloadAfter]
ReloadAfter
is an optional 4th parameter that configures the reload/refresh period.
It is an integer that represents time in seconds.
If not specified, it defaults to the provider's default setting, which is 90 seconds.
The default ReloadAfter
setting can be overridden as well:
{
"AppConfig": {
"Defaults": {
"ReloadAfter": 120
}
}
}
Feature Flags
Feature Flag configuration profile types can be consumed by the provider and are automatically translated to .NET FeatureManagement-compatible configuration. Both simple and complex feature flags are supported.
To specify feature flag profiles, add the profile metadata to the FeatureFlags
array instead of Profiles
:
{
"AppConfig": {
"Profiles": [
// Freeform configuration profile
"abc1234:def5678:ghi9123",
// Freeform configuration profile
"q2w3e25:po92j45:bt9s090:300"
],
"FeatureFlags": [
// Feature Flag profile
"bvt1234:glw6348:zup8532"
]
}
}
Due to the differences between the AppConfig and FeatureManagement configuration setup and the validation constraints that AppConfig uses for feature flags, the provider has some opinionated quirks when it comes to feature flags.
Simple Flags
A "simple" flag is one that can be enabled or disabled and does not contain any attributes. AppConfig returns these as an object with a single field:
{
"customFeatureFlag": {
"enabled": true
}
}
This gets translated to:
{
"FeatureManagement": {
"CustomFeatureFlag": true
}
}
The provider will automatically convert the name of the flag to PascalCase.
Complex Flags
A "complex" flag is one that contains attributes that specify feature filters and, optionally, their parameters.
AppConfig will return these like this:
{
"complexFlag": {
"enabled": true,
"customProperty": "customValue",
// etc.
}
}
To get around some of the limitations of how AppConfig lets you construct attributes, the following transformations rules are in place:
- The feature name is the PascalCase version of the flag name
- The
enabled
field is always ignored - The
requirementType
field is converted toRequirementType
- It must be either
All
orAny
(default if omitted)
- It must be either
- Any other fields are considered to be feature filters and/or their parameters
- A parameterless filter should be named
featureFilter
and have a blank/null value (e.g."alwaysOn": null
) - A filter with parameters should be named
featureFilter__parameterName
and have a value for the parameter (e.g."percentage__value": 50
)- The provider uses the double underscore (
__
) to separate the filter name from the parameter name - You can supply multiple parameters using this scheme (e.g.
"percentage__value": 50, "percentage__foobar": "baz"
)
- The provider uses the double underscore (
- Namespaced filters are support with the usage of a single underscore (
_
) (e.g."namespace_featureFilter": null
→Namespace.FeatureFilter
) - Extremely complex filters with deeply nested attributes are not supported (ex.
Microsoft.Targeting
and its parameters)
- A parameterless filter should be named
There are likely to be some limitations with this approach, so please open an issue if you find any that don't match your use case.
Sample
A sample ASP.NET Web Application is available in the samples/AppConfigTesting
folder.
In your own AWS environment, copy the contents of yamltest.yml
into a new AppConfig freeform configuration profile.
Then, create a new Feature Flag configuration profile with 2 flags: enableFoobar
and complexFlag
.
Feel free to add any attributes you want to complexFlag
that match the rules described in the Feature Flags section.
Then, use dotnet user-secrets
to specify the AppConfig profile:
# Freeform configuration profile
dotnet user-secrets set "AppConfig:Profiles:0" "abc1234:def5678:ghi9123" # <-- Replace with your own profile
# Feature Flag configuration profile
dotnet user-secrets set "AppConfig:FeatureFlags:0" "bvt1234:glw6348:zup8532" # <-- Replace with your own profile
Finally, ensure that you have the correct AWS credentials/profile configured in your environment, and run the sample:
dotnet run
Experiment by changing the configuration on AppConfig and deploying. After a while, you should see the application reload the configuration automatically when you refresh the home page.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | 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. |
-
net6.0
- AWSSDK.AppConfigData (>= 3.7.300.32)
- CatConsult.ConfigurationParsers (>= 2.1.0)
- Humanizer.Core (>= 2.14.1)
- Microsoft.Extensions.Configuration (>= 6.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 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 | |
---|---|---|---|
2.5.1 | 8,572 | 1/10/2024 | |
2.5.0 | 115 | 1/9/2024 | |
2.0.0 | 142 | 1/2/2024 | |
2.0.0-beta | 147 | 12/8/2023 | |
2.0.0-alpha | 138 | 12/7/2023 | |
1.1.0 | 3,910 | 7/7/2023 | |
1.0.0 | 4,152 | 6/25/2023 |