Содержание
Нефайловые провайдеры конфигурации в ASP.NET Core представлены следующими классами:
MemoryConfigurationProvider
– использует коллекцию в памяти в качестве настроек приложенияCommandLineConfigurationProvider
– загружает конфигурацию из аргументов командной строки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
. Очевидными преимуществами этого подходя являются то, что:
- нет необходимости каким-либо образом менять код файла Program.cs
- для различных профилей запуска можно определять свои аргументы командной строки.
Запуск приложения из 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 в котором можно определить необходимую конфигурацию приложения.