В повседневных сценариях разработки и эксплуатации приложение должно поддерживать все перечисленные виды конфигурации (как минимум) совместно.
Давайте попробуем написать такое приложение:
В папке с нашими уроками введите команду:
dotnet new console -o lesson07
Заменим код Program.cs на:
using Microsoft.Extensions.Configuration;
var env = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env}.json", true, true)
.AddEnvironmentVariables()
.AddCommandLine(args)
.Build();
var firstWord = config["AppSettings:FirstWord"];
var secondWord = config["AppSettings:SecondWord"];
var version = config["AppSettings:Versions:0:Number"];
Console.WriteLine($"{firstWord} {secondWord} {version}");
Создайте новый файл appsettings.json в том же каталоге, что и ваш файл Program.cs.
{
"AppSettings": {
"FirstWord": "Hello",
"SecondWord": "dotnet",
"Versions": [
{
"Number": 7
}
]
}
}
Создайте новый файл appsettings.Development.json в том же каталоге, что и ваш файл Program.cs.
{
"AppSettings": {
"Versions": [
{
"Number": 8
}
]
}
}
В консоле перейдите в папку с проектом.
Установим зависимость через dotnet cli:
dotnet add package Microsoft.Extensions.Configuration.Json --version 7.0.0
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables --version 7.0.0
dotnet add package Microsoft.Extensions.Configuration.CommandLine --version 7.0.0
Добавление пакетов отразится в файле lesson07.csproj
Вместо имени файла укажите шаблон appsettings*.json в csproj, все файлы подходящие под него будут копироваться в директорию при сборке проекта. Давайте добавим нужную настройку в lesson07.csproj.
<ItemGroup>
<Content Include="appsettings*.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
Должно получиться следующее:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Content Include="appsettings*.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
</ItemGroup>
</Project>
В этом примере мы вначале читаем значения параметров конфигурации обязательного json файла, затем на его параметры накатываем параметры не обязательного json файла (зависимого от названия среды), затем параметры окружения, затем переменные запуска. На что тут стоит обратить внимание:
От очерёдности конфигураторов зависит результирующие параметры доступные в приложении, в случае задания одного и того же параметра через разные источники вернётся параметр из самого последнего конфигуратора.
Вместо конкретного названия файла можно указывать шаблон appsettings*.json.
Запустите приложение без параметров:
dotnet run
Вы получите вывод:
Hello dotnet 7
Запустите приложение с параметром окружения DOTNET_ENVIRONMENT:
DOTNET_ENVIRONMENT=Development dotnet run
<aside> 🦮 Переменные окружения можно экспортировать в той же команде запуска приложения.
</aside>
Вы получите вывод:
Hello dotnet 8
Запустите приложение с дополнительным параметром окружения AppSettings__Versions__0__Number:
DOTNET_ENVIRONMENT=Development AppSettings__Versions__0__Number=9 dotnet run
<aside>
🦮 Для переопределения параметров конфигурации JSON через переменные окружения для доступа к элементу массива нужно указать его индекc, для доступа во внутреннюю сущность нужно использовать разделитель __. В отличие от приложения, в bash разделитель : в названиях переменных не поддерживается.
</aside>
Вы получите вывод:
Hello dotnet 9
Запустите приложение с дополнительным аргументом запуска AppSettings:Versions:0:Number:
DOTNET_ENVIRONMENT=Development \
AppSettings__Versions__0__Number=9 \
dotnet run AppSettings:Versions:0:Number=10
<aside>
🦮 Для переноса команды на новую строку в bash используется символ \. Обратите внимание в аргументах запуска используется разделитель :.
</aside>
Вы получите вывод:
Hello dotnet 10