CustomEnvironmentConfig 1.6.0
System.Text.Json had a serious vulnerability that is addressed in 2.0.0 or higher.
See the version list below for details.
dotnet add package CustomEnvironmentConfig --version 1.6.0
NuGet\Install-Package CustomEnvironmentConfig -Version 1.6.0
<PackageReference Include="CustomEnvironmentConfig" Version="1.6.0" />
paket add CustomEnvironmentConfig --version 1.6.0
#r "nuget: CustomEnvironmentConfig, 1.6.0"
// Install CustomEnvironmentConfig as a Cake Addin #addin nuget:?package=CustomEnvironmentConfig&version=1.6.0 // Install CustomEnvironmentConfig as a Cake Tool #tool nuget:?package=CustomEnvironmentConfig&version=1.6.0
CustomEnvironmentConfig
Enables binding environment variables and/or environment files to classes.
Changelog
07/08/2020 [v1.4.1]
- Added support for enums.
Examples
(.env [environment variables])
MyConfigItem=Test Value
Subclass_MyConfigSubItem=Test Subitem Value
(MyConfiguration.cs)
public class MyConfiguration
{
public string MyConfigItem { get; set; }
public MyConfigSubClass Subclass { get; set; }
}
public class MyConfigSubClass
{
public string MyConfigSubItem { get; set; }
}
(Program.cs)
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseEnvironmentConfiguration<MyConfiguration>()
.....
(Startup.cs)
public class Startup
{
private readonly MyConfiguration _configuration;
public Startup(MyConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
...
Console.WriteLine(_configuration.MyConfigItem);
Console.WriteLine(_configuration.Subclass.MyConfigSubItem);
...
}
}
If you want, you can re-map the name of the items using [ConfigurationItem]: (Do note, [ConfigurationItem] is not required and only needed if you want to set the requirement policy of a property or change the name of the environment variable)
public class MyConfiguration
{
[ConfigurationItem("MyItem")]
public bool Item { get; set; }
// OR
[ConfigurationItem(Name = "MyOtherItem")]
public int OtherItem { get; set; }
[ConfigurationItem("Test")
public SubConfiguration MySubClass { get; set; }
}
public class SubConfiguration
{
[ConfigurationItem]
public bool SubItem { get; set; }
}
If you want to ignore parsing certain properties in a class, you can use [ConfigurationItem(Ignore = true)]:
public class MyConfiguration
{
[ConfigurationItem("MyItem")]
public bool Item { get; set; }
public int OtherItem { get; set; }
[ConfigurationItem(Ignore = true)]
public SubConfiguration MySubClass { get; set; }
}
The environment variables for this would look like as follows:
MyItem=Value
MyOtherItem=Value
Test_SubItem=Value
You can also set if the item is required to be set in the environment or not. By default, items are required.
public class MyConfiguration
{
[ConfigurationItem(Required = false)]
public bool NotRequiredItem { get; set; }
// OR
[ConfigurationItem(Name = "MyOtherItem", Required = true)]
public int OtherItem { get; set; }
}
If you want to specify a default value for an item if it's not required:
public class MyConfiguration
{
[ConfigurationItem(Required = false, Default = true)]
public bool NotRequiredItem { get; set; }
// OR
[ConfigurationItem(Required = false, Default = 123)]
public int OtherItem { get; set; }
}
Conversions across types are supported for defaults, for instance:
(string)"123" => (int)123
(string)"true" => (bool)True
(string)"false" => (bool)False
(int)1 => (bool)True
(int)0 => (bool)False
...etc
From an Env File:
Most of this applies from above, except instead your IWebHostBuilder would look like:
// Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseEnvironmentConfiguration<MyConfiguration>(fileName: "filename.env", configurationTypeEnum: ConfigurationTypeEnum.PreferEnvironment)
.....
Non-DI:
To parse environment variables directly:
public void MyFunction()
{
var output = ConfigurationParser.Parse<MyClass>();
// Access your class via output variable
}
To parse from an environment file:
public void MyFunction()
{
var output = ConfigurationParser.Parse<MyClass>(fileName: "file.env");
// Access your class via output variable
}
Preferences
You can choose one of the following preferences:
- Prefer Environment Over File
- Prefer File Over Environment
- Use Environment Only
- Use File Only
The default functionality is Prefer Environment over File.
To use this functionality, there's two ways, both DI and non-DI:
DI
// Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseEnvironmentConfiguration<MyConfiguration>(fileName: "filename.env", configurationTypeEnum: ConfigurationTypeEnum.PreferEnvironment)
.....
Non-DI
public void MyFunction()
{
var output = ConfigurationParser.Parse<MyClass>(fileName: "file.env", configurationTypeEnum: ConfigurationTypeEnum.PreferEnvironment);
.....
}
Manual-DI (for non asp.net core projects)
public void Main()
{
var servicesBuilder = new ServiceCollection();
var output = ConfigurationParser.Parse<MyClass>(fileName: "file.env", configurationTypeEnum: ConfigurationTypeEnum.PreferEnvironment);
servicesBuilder.AddSingleton(output);
var services = servicesBuilder.BuildServiceProvider();
// Access MyClass in constructor or like below
var config = services.GetService<MyClass>();
.....
}
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 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 | netcoreapp3.1 is compatible. |
-
.NETCoreApp 3.1
- Microsoft.AspNetCore.Hosting.Abstractions (>= 2.2.0)
- Microsoft.Extensions.DependencyInjection (>= 3.1.10)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 3.1.10)
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 | |
---|---|---|---|
8.0.0 | 358 | 9/24/2024 | |
2.1.0 | 85 | 9/24/2024 | |
2.0.1 | 4,148 | 7/24/2023 | |
2.0.0 | 242 | 7/24/2023 | |
1.7.1 | 3,570 | 3/1/2022 | |
1.7.0 | 524 | 3/1/2022 | |
1.6.3 | 6,871 | 10/4/2021 | |
1.6.2 | 474 | 10/4/2021 | |
1.6.1 | 401 | 10/4/2021 | |
1.6.0 | 1,955 | 1/11/2021 | |
1.5.0 | 821 | 11/18/2020 | |
1.4.1 | 3,178 | 7/9/2020 | |
1.4.0 | 589 | 6/29/2020 | |
1.3.0 | 1,747 | 5/5/2020 | |
1.2.3 | 1,907 | 6/18/2019 | |
1.2.2 | 1,011 | 4/30/2019 | |
1.2.1 | 690 | 4/16/2019 | |
1.2.0 | 671 | 4/10/2019 | |
1.1.2 | 771 | 3/6/2019 | |
1.1.1 | 658 | 3/6/2019 | |
1.1.0 | 653 | 3/6/2019 | |
1.0.1 | 910 | 2/19/2019 | |
1.0.0 | 767 | 2/19/2019 |