Содержание
Нефайловые провайдеры конфигурации в 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 в котором можно определить необходимую конфигурацию приложения.