Нефайловые провайдеры конфигурации

Нефайловые провайдеры конфигурации в ASP.NET Core представлены следующими классами:

  1. MemoryConfigurationProvider – использует коллекцию в памяти в качестве настроек приложения
  2. CommandLineConfigurationProvider – загружает конфигурацию из аргументов командной строки
  3. EnvironmentVariablesConfigurationProvider – загружает настройки приложения из переменных среды.

В отличие от использования файловых провайдеров конфигурации, нефайловые провайдеры позволяют конфигурировать приложение, используя, в основном, только пары «ключ-значение». Для того, чтобы создать иерархическую структуру, например, как при использовании JSON-файлов в имени ключа секции, подсекции и именах ключей используются символы «:» (двоеточие).

Также следует отметить, что настройки приложения, которые были добавлены с использованием нефайловых провайдеров, не сохраняются после закрытия приложения. Тем не менее, эти провайдеры находят широкое применение при разработке приложений ASP.NET Core и пренебрегать ими ни в коем случае не стоит.

Работа с коллекцией настроек приложения в памяти

В случае необходимости мы можем разместить конфигурацию приложения непосредственно в памяти, используя коллекцию пар «ключ-значение». Для этого используется провайдер MemoryConfigurationProvider и метод расширения IConfigurationBuilder AddInMemoryCollection(). Например, воспользуемся примером приложения из предыдущей части и изменим файл Program.cs следующим образом

var builder = WebApplication.CreateBuilder(args);

//добавляем настройки в память
builder.Configuration.AddInMemoryCollection(new Dictionary<string, string?>
{
    ["Weather:Count"] = "1"
});


// Add services to the container.
builder.Services.AddControllers();

var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();

Для передачи начальных данных конфигурации в метод мы использовали словарь Dictionary<string, string?>:

builder.Configuration.AddInMemoryCollection(new Dictionary<string, string?>
{
    ["Weather:Count"] = "1"
});

Здесь мы, используя разделитель «:» добавили секцию «Weather», используя коллекцию настроек в памяти. Стоит отметить, что этот провайдер используется при создании экземпляра WebApplicationBuilder для сохранения в конфигурации, например, таких настроек приложения как значение свойства WebRootPath.

Работа с аргументами командной строки

Аргументы командной строки являются одним из популярных способов задания начальной конфигурации приложения. Аргументы командной строки должны представляться в виде пары «ключ-значение». При этом есть несколько способов их определения:

Способ №1: key1=value1 key2=value2 – в этом способе мы через пробел перечисляем ключи и значения.

Способ №2: key1=value1 или key2 value2 или key3 – в этом случае перед названием ключа ставится -- и, при этом, значения ключа мы можем указывать через символ или через пробел. Также, в этом случае можно не указывать значение ключа или же вместо символов «-» перед именем ключа указывать символ /.

При использовании аргументов командной строки стоит сразу определиться со способом их определения и не смешивать его с другими способами.

Для использования аргументов командной строки в качестве конфигурации используется провайдер CommandLineConfigurationProvider, который добавляется в приложение с помощью метода расширения AddCommandLine(). Стоит обратить внимание на то, что провайдер CommandLineConfigurationProvider уже по умолчанию добавлен в приложение, поэтому, в большинстве случаев, нам нет необходимости явно вызывать этот метод – достаточно сразу задать аргументы командной строки и использовать их для конфигурации приложения.

Использование аргументов командной строки в Visual Studio

Для тестирования конфигурации приложения с использованием аргументов командной строки в Visual Studio мы можем использовать сразу несколько подходов.

Использование псевдо-аргументов

Этот способ позволяет нам передавать в качестве аргументов командной строки обычный массив строк непосредственно в коде приложения. Для этого массив, содержащий конфигурацию приложения должен быть определен до вызова метода CreateBuilder(). Пример использования такого подхода представлен ниже

string[] cmd = ["Weather:Count=2"];
var builder = WebApplication.CreateBuilder(cmd);

//здесь остальной код файла Program.cs

В этом примере мы вместо стандартного параметра args передаем в метод CreateBuilder() массив cmd, содержащий необходимые настройки приложения.

Использование настроек в файле launchSettings.json

Для определения аргументов командной строки в файле launchSettings.json достаточно задать параметр commandLineArgs. Очевидными преимуществами этого подходя являются то, что:

  1. нет необходимости каким-либо образом менять код файла Program.cs
  2. для различных профилей запуска можно определять свои аргументы командной строки.

Запуск приложения из PowerShell

Еще один способ передачи аргументов командной строки – это выполнить команду dotnet run в PowerShell перечислив необходимые аргументы

 

Использование метода расширения AddCommandLine()

Если по каким-либо причинам первые три способа использования аргументов командной строки вам не подходят, то можно также передать необходимые аргументы, использовать метод расширения AddCommandLine(), передав в него массив строк также, как мы это делали при использовании псевдо-аргументов

var builder = WebApplication.CreateBuilder(args);

string[] cmd = ["Weather:Count=2"];
builder.Configuration.AddCommandLine(cmd);

Сопоставление имен ключей

Не всегда удобно при использовании аргументов командной строки использовать длинные имена ключей. Например, если мы запускаем приложение из PowerShell, то удобнее было бы задать имя ключа как «--count» вместо «Weather:Count». Для того, чтобы ASP.NET Core могла сопоставить различные имена ключей, можно передать в метод AddCommandLine() словарь необходимых значений. Пример использования такого словаря представлен ниже

var builder = WebApplication.CreateBuilder(args);

string[] cmd = ["Weather:Count=2"];
builder.Configuration.AddCommandLine(cmd,, new Dictionary<string, string>()
{
    { 
        "--count" , "Weather:Count" 
    }
});

Здесь первый параметр метода AddCommandLine() – это массив, содержащий аргументы командной строки с именами ключей, которые мы можем использовать, например, при запуске приложения из PowerShell. Второй параметр – это словарь для сопоставления имени ключа из командной строки и имени ключа, используемого в приложении. Таким образом, если приложение находит, в командной строке ключ «—count», то уже внутри приложения значение этого ключа будет сопоставлено с именем «Weather:Count» и т.д.

Работа с переменными среды

Для загрузки переменных среды окружения в качестве параметров конфигурации в ASP.NET Core применяется провайдер EnvironmentVariablesConfigurationProvider и, соответствующий метод расширения IConfigurationBuilder – AddEnvironmentVariables(). При этом, как и в случае, с аргументами командной строки, среда ASP.NET Core уже загружает переменные среды окружения в объект конфигурации по умолчанию.

Для тестирования использования переменных среды окружения для конфигурации приложения мы также можем использовать настройки файла launchSettings.json

"https": {
  "commandName": "Project",
  "dotnetRunMessages": true,
  "launchBrowser": false,
  "applicationUrl": "https://localhost:7102;http://localhost:5187",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
    "Weather__Count": "7"
  }
}

Разделитель «:» (двоеточие) не работает с иерархическими ключами переменных среды на всех платформах поэтому для создания иерархической структуры мы использовали символ __ (двойное подчеркивание), который может использоваться на любых платформах.

Итого

В качестве нефайловых источников конфигурации мы можем использовать объекты в памяти, аргументы командной строки или же переменные среды. Для тестирования конфигурации в Visual Studio с использованием нефайловых провайдеров удобно использовать файл launchSettings.json в котором можно определить необходимую конфигурацию приложения.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии