Содержание
Аргументы командной строки, наряду с конфигурационными файлами, являются одним из популярных способов задания начальной конфигурации приложения. По умолчанию, используемый провайдер Command загружает аргументы командной строки после того как будут загружены: файлы 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 Использовать такой ключ каждый раз при запуске приложения — лишняя трата времени. Более того, чем длиннее имя ключа, тем легче ошибиться в его написании. Используя провайдер Command мы можем сопоставить имена ключей переданные в аргументах командной строки с их именами в приложении. Например, вот как можно сократить имена ключей, передаваемых в аргументах командной строки:
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-файлов.

