Конфигурация приложений Blazor с использованием командной строки

Аргументы командной строки, наряду с конфигурационными файлами, являются одним из популярных способов задания начальной конфигурации приложения. По умолчанию, используемый провайдер CommandLineConfigurationProvider загружает аргументы командной строки после того как будут загружены: файлы appsettings.json и appsettings.{Environment}.json, секреты приложения в среде разработки и переменные среды. То есть, если в нескольких источниках конфигурации будут содержаться одни и те же настройки, то применятся те настройки, которые будут содержаться в аргументах командной строки.

Способы определения аргументов командной строки

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

key1=value1 key2=value2

в этом способе мы через пробел перечисляем ключи и значения.

--key1=value1 или --key2 value2 или --key3

в этом случае перед названием ключа ставится -- и, при этом, значения ключа мы можем указывать через символ = или через пробел. Также, в этом случае можно не указывать значение ключа. Также, вместо — можно указывать символ /.

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

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

В предыдущей части для конфигурации приложения мы использовали json-файл, в котором была определена следующая конфигурация:

"UserOptions": {
    "UserName": "Вася",
    "UserPassword": "123456"
  }

чтобы задать эту же конфигурацию с помощью командной строки, нам необходимо запустить приложение, например, из PowerShell для разработчика с использованием следующих параметров:

dotnet run UserOptions:UserName=Вася UserOptions:UserPassword=123456

то есть, в имени ключа мы передаем через двоеточие его путь — UserOptions (название секции) :UserName (название ключа). Если необходимо, то можно задавать аргументы командной строки и без двоеточий (фактически, не используя секции). В этом случае, чтение конфигурации в Blazor будет следующим:

@code
{
    string? UserName = null;

    protected override void OnInitialized()
    {
        UserName = _config["UserName"];
    }
}

То есть, в данном случае, мы используем индексатор, определенный в интерфейсе IConfiguration.

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

Не всегда удобно, используя для запуска приложения командную строку, задавать длинные имена ключей. Например, выше мы использовали ключ с именем UserOptions:UserName Использовать такой ключ каждый раз при запуске приложения — лишняя трата времени. Более того, чем длиннее имя ключа, тем легче ошибиться в его написании. Используя провайдер CommandLineConfigurationProvider мы можем сопоставить имена ключей переданные в аргументах командной строки с их именами в приложении. Например, вот как можно сократить имена ключей, передаваемых в аргументах командной строки:

public static void Main(string[] args)
 {
     var builder = WebApplication.CreateBuilder(args);

     var switchMappings = new Dictionary<string, string>()
  {
      { "--name", "UserOptions:UserName" },
      { "--password", "UserOptions:UserPassword" }
  };

     builder.Configuration.AddCommandLine(args, switchMappings);
     .....
 }

Здесь мы передали в качестве второго аргумента в методе AddCommandLine словарь по которому будут сопоставляться имена ключей. Теперь допишем немного код компонента Pages/Index.razor:

@page "/"
@inject IConfiguration _config
<PageTitle>Index</PageTitle>

<h1>Hello, @UserName</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

@code 
{
    string? UserName = null; 
    protected override void OnInitialized() 
    {
        UserName = _config.GetSection("UserOptions").GetValue<string>("UserName");
    } 
}

Здесь мы уже используем имена ключей и секций без каких-либо сокращений.  Теперь можем открыть командную строку разработчика и протестировать наше приложения с использованием новых имен ключей:

Аргументы командной строки
Аргументы командной строки

Результат работы приложения:

Аргументы командной строки

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

Если нам необходимо протестировать работу нашего приложения с аргументами командной строки, то необязательно их задавать через PowerShell или командную строку разработчика. Рассмотрим пример:

public static void Main(string[] args)
{
    string[] myArgs = new[] { "--name=Bob", "--password=123456" }; //"виртуальные" аргументы

    var builder = WebApplication.CreateBuilder(myArgs);//передаем "виртуальные" аргументы в метод

    //сопоставляем имена ключей
    var switchMappings = new Dictionary<string, string>()
 {
     { "--name", "UserOptions:UserName" },
     { "--password", "UserOptions:UserPassword" }
 };

    builder.Configuration.AddCommandLine(myArgs, switchMappings);

Второй вариант — использовать метод AddCommandLine. В этом случае код приложения будет следующий:

public static void Main(string[] args)
{
    string[] myArgs = new[] { "--name=Bob", "--password=123456" };

    var builder = WebApplication.CreateBuilder(args); //оставили аргументы по умолчанию

    builder.Configuration.AddCommandLine(myArgs); добавили "виртуальные" аргументы

    //сопоставляем имена ключей
    var switchMappings = new Dictionary<string, string>()
 {
     { "--name", "UserOptions:UserName" },
     { "--password", "UserOptions:UserPassword" }
 };

    builder.Configuration.AddCommandLine(myArgs, switchMappings);

Результат работы будет одинаков — при запуске программы будут использованы ключи и значения из массива string[] myArgs:

Аргументы командной строки

Итого

Сегодня мы рассмотрели использование аргументов командной строки для задания начальной конфигурации приложения. Каждый параметр задается также в виде пар «ключ-значение» и при этом аргументы могут задаваться разными вариантами — через косую черту, начинающиеся с символов -- и.т.д. Аргументы командной строки перезаписывают параметры конфигурации передаваемые, например, с использованием json-файлов.

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