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

Последнее обновление: 21.12.2021

Загрузка аргументов командной строки

Для загрузки аргументов командной строки в конфигурацию приложения применяется провайдер CommandLineConfigurationProvider. Для применения этого провайдера у объекта ConfigurationManager (свойство Configuration объекта WebApplicationBuilder) вызывается метод AddCommandLine(), в который передаются аргументы командной строки. Но поскольку приложение по умолчанию загружает аргументы командной строки в объект конфигурации, который передается в классы приложения через dependency injection, то нам нет смысла явным образом его вызывать.

Каждый аргумент командной строки, который мы хотим использовать в качестве параметра конфигурации, должен представлять пару ключ-значение. Есть разные способы определения таких параметров. Самый распространненый - после ключа после знака равно = указывается значение, а через пробел последующие параметры:

key1=value1 key2=value2 key3=value3

Также можно использовать другие способы:

key1=value1 --key2=value2 /key3=value3
--key1 value1 /key2 value2
key1= key2=value2

Перед ключом можно указать префикс -- или /, тогда между ключом и значением можно опустить знак равно = и оставить просто пробел.

Также если мы хотим указать ключ, но не хотим указывать значение, то после знака равно можно не указывать значение.

Тестирование в Visual Studio

Для тестирования передачи параметров командной строки изменим в проекте в папке Properties файл launchSettings.json.

launchSettings.json и установка аргументов командной строки в ASP.NET Core и C#

По умолчанию он выглядит примерно следующим образом:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:56234",
      "sslPort": 44384
    }
  },
  "profiles": {
    "HelloApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:7256;http://localhost:5256",
      "dotnetRunMessages": true
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Перейдем в этом файле к элементу "profiles". Этот элемент по умолчанию содержит два профиля, которые могут применяться для запуска. Один профиль называется по имени проекта (в моем случае HelloApp). Второй профиль называется "IIS". Выберем профиль, который мы используем для запуска проекта и добавим в этот элемент строку

"commandLineArgs": "name=Bob age=37",

Параметр "commandLineArgs" позволяет определить данные командной строки, которые будут передаваться приложению. В данном случае предполагается, что через командную строку будут передаваться параметр name со значением "Bob" и параметр age со значением "37". Например, я запускаю проект как консольное приложение, поэтому я изменяю профиль по имени проекта - HelloApp. Который после изменения будет выглядеть следующим образом:

"HelloApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "commandLineArgs": "name=Bob age=37",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:7256;http://localhost:5256",
      "dotnetRunMessages": true
    },

Определим в приложении простейший код для получения значений конфигурации:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.Map("/", (IConfiguration appConfig) => $"{appConfig["name"]} - {appConfig["age"]}");

app.Run();

Здесь важно отметить передачу параметров командной строки - args в метод WebApplication.CreateBuilder(args). Благодаря этому приложение автоматически может подхватить параметры командной строки. И после запуска мы увидим указанные значения параметров конфигурации:

Установка конфигурации командной строки в ASP.NET Core и C#

Запуск через консоль

Используя CLI, мы можем запустить приложение из командной строки и передать ему параметры.

Итак, удалим выше определенные параметры и выполним перестроение проекта. Откроем командную строку и перейдем в консоли с помощью команды cd в папку проекта. В моем случае это папка C:\Users\Eugene\Source\Repos\CSharp\ASPNET\HelloApp\HelloApp.

Далее введем следующую команду:

dotnet run name=Tom age=35
dotnet run и конфигурация командной строки в ASP.NET Core и C#

В итоге приложение подхватит переданные данные:

CommandLineConfigurationProvider в ASP.NET Core и C#

Программная симуляция аргументов командной строки

Также мы можем на уровне кода симулировать передачу параметров командной строки:

string[] commandLineArgs = { "name=Alice", "age=29" };  // псевдопараметры командной строки
var builder = WebApplication.CreateBuilder(commandLineArgs);
var app = builder.Build();

app.Map("/", (IConfiguration appConfig) => $"{appConfig["name"]} - {appConfig["age"]}");

app.Run();

Применение метода AddCommandLine

Также можно было бы передать параметры командной строки через метод AddCommandLine():

var builder = WebApplication.CreateBuilder();
string[] commandLineArgs = { "name=Sam", "age=25" };  // псевдопараметры командной строки
builder.Configuration.AddCommandLine(commandLineArgs);	// передаем параметры в качестве конфигурации

var app = builder.Build();
app.Map("/", (IConfiguration appConfig) => $"{appConfig["name"]} - {appConfig["age"]}");

app.Run();

Переменные среды окружения как источник конфигурации

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

Например, получим переменную окружения "JAVA_HOME", которая указывает на папку установки java sdk, если эта переменная определена:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Map("/", (IConfiguration appConfig) => $"JAVA_HOME: {appConfig["JAVA_HOME"] ?? "not set"}");

app.Run();
Получение переменных среды из конфигурации в ASP.NET Core и C#

Явное применение метода AddEnvironmentVariables():

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

builder.Configuration.AddEnvironmentVariables();

Хранение конфигурации в памяти

Провайдер MemoryConfigurationProvider позволяет использовать в качестве конфигурации коллекцию IEnumerable<KeyValuePair<string, string>>, которая хранит данные в виде пары ключ-значение (пример - объект Dictionary). Для добавления источника конфигурации применяется метод AddInMemoryCollection(), в который передается словарь конфигурационных настроек:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

builder.Configuration.AddInMemoryCollection(new Dictionary<string, string>
{
    {"name", "Tom"},
    {"age", "37"}
});

app.Map("/", (IConfiguration appConfig) =>
{
    var name = appConfig["name"];
    var age = appConfig["age"];
    return $"{name} - {age}";
});

app.Run();
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850