Использование файла конфигурации

appsettings.json - это файл конфигурации, который можно использовать для хранения настроек и информации о конфигурации приложения. В C# вы можете использовать пакет Microsoft.Extensions.Configuration для чтения данных конфигурации из appsettings.json.

Давайте попробуем написать приложение использующее конфигурацию:

  1. В папке с нашими уроками введите команду:

    dotnet new console -o lesson06
    
  2. Заменим код Program.cs на:

    using Microsoft.Extensions.Configuration;
    
    var config = new ConfigurationBuilder()
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .Build();
    
    var mySetting = config["MySetting"];
    
    if (string.IsNullOrEmpty(mySetting))
    	Console.WriteLine("Setting not found in appsettings.json.");
    else
    	Console.WriteLine($"Setting value: {mySetting}");
    
  3. Создайте новый файл appsettings.json в том же каталоге, что и ваш файл Program.cs.

    {
        "MySetting": "Hello dotnet 7"
    }
    

    <aside> 🔥 Тут нужно быть осторожным, так как эти файлы appsettings.json попадают в сборку в них не должно быть информации чувствительной к просмотру.

    </aside>

  4. В консоле перейдите в папку с проектом.

  5. Установим зависимость через dotnet cli:

    dotnet add package Microsoft.Extensions.Configuration.Json --version 7.0.0
    

    Добавление пакета отразится в файле lesson06.csproj

  6. Так как файл appsettings.json не часть компилируемого кода проекта, а файл конфигурации, нужно явно указать, что его нужно копировать при сборке в выходную директорию. Давайте добавим нужную настройку в lesson06.csproj.

    <ItemGroup>
      <Content Include="appsettings.json">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    

    Должно получиться следующее. К слову блоков ItemGroup может быть несколько или один, позиция блока на результат влиять не будет:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net7.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
      </ItemGroup>
    
      <ItemGroup>
        <Content Include="appsettings.json">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    
    </Project>
    

    В этом примере мы читаем значение параметра с именем MySetting из appsettings.json. Если параметр не найден или имеет пустое значение, выводим сообщение о том, что параметр не найден в файле конфигурации. В противном случае мы выводим значение параметра в консоль. На что тут стоит обратить внимание:

  7. Ключевое слово using при импорте зависимости делает доступными её код без указания полного пути до используемого содержимого библиотеке. Пример:

    // До импорта
    var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder();
    
    // После иморта
    using Microsoft.Extensions.Configuration;
    
    var builder = new ConfigurationBuilder();
    

    <aside> 🐕 Подробней про using можно почитать тут https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/statements/declarations.

    </aside>

  8. appsettings.json файл содержит конфигурацию приложения, его зависимостей (если требуется) в формате JSON.

    <aside> 🐕 JSON - это популярный формат текстовых данных, который используется для обмена данными в веб и мобильных приложениях. Кроме того, JSON используется для хранения неструктурированных данных в файлах журналов или базах данных NoSQL.

    </aside>

  9. Зависимость Microsoft.Extensions.Configuration.Json это готовое решение для загрузки файлов конфигурации в формате JSON.

    <aside> 🐕 Большинство зависимостей публикуется тут https://www.nuget.org/, зависимость из примера можно найти по адресу https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/.

    </aside>

  10. Класс ConfigurationBuilder - своего рода контейнер для всех видов параметров конфигураций. Доступен через Microsoft.Extensions.Configuration.Json .

  11. Метод AddJsonFile класса ConfigurationBuilder позволяющий: указать адрес до JSON файла конфигурации, признак необязательности файла - optional, перезагрузка конфигурации при изменении файла - reloadOnChange.

  12. Именованный вариант передачи аргументов.

    <aside> 🐕 Подробней про именованные аргументы можно почитать тут https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/statements/declarations.

    </aside>

  13. Метод Build класса ConfigurationBuilder собирающий все заданные насройки конфигурации и возвращающий эксемпляр сконфигурированной конфигурации.

  14. На этом всё, давайте сохраним файл и убедимся что консоль находится в папке с уроком lesson06.

  15. Запустите приложение без параметров:

    dotnet run
    
  16. Вы получите вывод:

    Setting value: Hello dotnet 7

    Вы можете заметить, что после сборки проекта файл с конфигурацией был скопирован в ./bin/Debug/net7.0/appsettings.json.

<aside> 🐕 В этом уроке мы научились использовать в приложение файл конфигурации. Это позволит нам конфигурировать приложения через заранее сформированные параметры конфигурации.

</aside>