PIHelperSh.Configuration 1.0.1

dotnet add package PIHelperSh.Configuration --version 1.0.1                
NuGet\Install-Package PIHelperSh.Configuration -Version 1.0.1                
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="PIHelperSh.Configuration" Version="1.0.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add PIHelperSh.Configuration --version 1.0.1                
#r "nuget: PIHelperSh.Configuration, 1.0.1"                
#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 PIHelperSh.Configuration as a Cake Addin
#addin nuget:?package=PIHelperSh.Configuration&version=1.0.1

// Install PIHelperSh.Configuration as a Cake Tool
#tool nuget:?package=PIHelperSh.Configuration&version=1.0.1                

Библиотека конфигурации

Данная библиотека предназначена для упрощения процесса конфигурирования параметров (appsettings.json + env)

Автоматическое конфигурирование

Если имеется некоторый объект, имеющий конфигурацию из нескольких элементов разумно будет объединить их в группу. Для этого создадим класс, содержащий нужные поля. Название класса должно совпадать с именем секции в appsettings.json (слово Configuration, если оно есть в имени класса можно опустить в названии секции), а имена переменных - с их наименованиями в этой секции. Например для данного фрагмента appsettings.json

{
	"TestConfiguration":{
	  "Test":"some text",
	  "Number": 123,
	  "AnotherTest": "another text"
	}
}

Можно создать такой конфигурационный класс:

[AutoConfiguration]
public class TestConfiguration
{
    public string Test { get; init; }
    public int Number { get; init; }
    [FromEnvironment("TEST_CONFIG")]
    public string AnotherTest { get; init; }
}
  • Атрибут AutoConfiguration указывает на то, что данный класс является классом конфигурации и будет добавлен и обработан автоматически. Он обязателен для выполнения автоматической конфигурации
  • Атрибут FromEnvironment указывает на то, что данное может быть заполнено из env с именем TEST_CONFIG при этом, если таковой нет, то значение будет взято из appsettings.json как и остальные
  • В случае отсутствия атрибута FromEnvironment возможность заполнения переменной из env остаётся. В таком случае, в качестве имени используется конструкция вида "ИМЯ_СЕКЦИИ_ИМЯ_ПЕРЕМЕННОЙ". Например, в случае AnotherTest это будет ANOTHER_TEST Для непосредственного выполнения конфигурирования разом всех классов помеченных атрибутом AutoConfiguration необходимо использовать метод расширения библиотеки:
builder.Services.AddConfigurations(builder.Configuration);

Далее класс можно получить из DI контейнера через конструктор следующим образом:

public TestClass(IOptions<TestConfiguration> options)
{
  _config = options.Value
}

Константы

Библиотека имеет возможность определять "константы" - статические переменные класса, заполняемые автоматически из appsettings.json и env. Для создания таковой необходимо, в первую очередь, отметить класс, в который она добавляется атрибутом TrackedType. Он позволит системе определить, что в данном классе в целом нужно искать "константы". Далее, как отмечалось ранее, переменные должны быть статическими. При этом это могут быть и свойства и поля. Так же необходимо наличие атрибута Constant. Пример класса с "константами":

[TrackedType]
public class TestClass
{
   [Constant(BlockName = "Test", ConstantName = "Test1")]
   static int _test1;

   [Constant(BlockName = "Test", ConstantName = "Test2")]
   static TestEnum _testEnum;

   [Constant(BlockName = "Test")]
   static string _test3 { get; set; } = null!;

   [Constant(BlockName = "Test", ConstantName = "Test3")]
   static string _test5 = null!;

   [Constant(BlockName = "Test", VariableName = "ANOTHER_NAME")]
   public static string Test4 = null!;
 
   [Constant(BlockName = "Test", ConstantName = "Test4")]
   public static string Test6 { get; set; } = null!;
   ...
}

Вид фрагмента appsettings.json для описанного ранее класса:

{
	"Test": {
	  "Test1": 123,
	  "Test2": 3,
	  "Test3": "abacaba",
	  "Test4": "hello world"
	}
}
  • Атрибут Constant может получать значения из appsettings.json и из env (приоритет). Поддерживается вариант, при котором указывается только имя секции (BlockName ), в которой находится переменная, в то время как имя берётся из имени "константы" (символ '_' использовать в именовании переменной можно, он будет игнорироваться). Так же имя можно задать самостоятельно через свойство ConstantName . Важно отметить, что как и в случае с конфигурацией, если не указать имя env (через свойство VariableName) , оно будет взято как "ИМЯ_СЕКЦИИ_ИМЯ_ПЕРЕМЕННОЙ". Для того, чтобы заполнить все "константы" значениями необходимо воспользоваться методом расширения AddConstants.
builder.Configuration.AddConstants();

Ручное конфигурирование

В случае необходимости, библиотека поддерживает возможность ручного конфигурирования. Оно полностью аналогично автоматическому, с той лишь разницей, что атрибут AutoConfiguration не требуется, а классы, которые будут использоваться как конфигурационные необходимо зарегистрировать индивидуально, используя метод расширения ConfigureWithENV

builder.Services.ConfigureWithENV<TestConfiguration>(builder.Configuration)
Product Compatible and additional computed target framework versions.
.NET 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. 
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.0.1 138 8/30/2024
1.0.0 150 8/21/2024 1.0.0 is deprecated because it has critical bugs.