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