ASP.NET Core — использование файлов конфигурации

Если мы говорим о файлах конфигурации в ASP, то традиционно на ум приходит файл web.config. Но проблема с ним в том, что в этом файл попадало буквально всё, что можно было вынести в конфигурационный файл и он становился эдаким "монстром". И это стало одной из главных причин, почему было решено отказаться от его в ASP.NET Core. То, как можно задавать конфигурацию приложения в .NET Core рассмотрим ниже.

Взгляните на пример получения значений из файла конфигурации.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var configBuilder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("settings.json", optional:true, reloadOnChange:true)
        .AddJsonFile($"settings.{env.EnvironmentName}.json", optional: true);;

    configBuilder.AddEnvironmentVariables();

    Configuration = configBuilder.Build();
}

.SetBasePath(env.ContentRootPath) — задаст пусть к корневой директории нашего приложения. При необходимости, вы можете дополнить, указав отдельный каталог для ваших конфигураций.

.AddJsonFile — добавляет JSON файл. Пометив его как optional:true, мы сделали файл конфигурации не обязательным, если на момент запуска он не будет существовать, это не будет проблемой, reloadOnChange:true указывает на то, что при изменении параметров файла конфигурации, они будут перезагружены без необходимости перезагружать приложение.

.AddEnvironmentVariables — загружает параметры конфигурации из переменной среды.

Переменные среды

Вы можете задавать переменные и их значения для каждой запускаемой среды отдельно. Если заданные параметры будут попадать в конфигурацию, то при их использовании вы всегда будете иметь актуальные данные параметров. Для того чтобы задать переменные среды необходимо зайти в настойки проекта, зайти в Debug, выбрать нужный профиль и записать нужные значения:

Запись переменных среды в ASP.NET Core

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

Если вы хотите использовать записанные параметры конфигурации в других классах, помимо Startup, будет удобно пометить её как static

public static IConfiguration Configuration { get; set; }

Тогда использовать можно будет следующим образом:

var email = Startup.Configuration["User:Email"];
Использование параметра из файла конфигурации в ASP.NET Core

Сам JSON файл представляет из себя следующее:

{
  "User": {
    "Name": "root",
    "Email": "root@mytestsite.com"
  },
  "Logging": {
    "Level": {
      "Debug": "Debug",
      "Release":  "Information" 
    }
  }
}

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

User:Name — содержит значение "root"

User:Email — содержит значение "root@mytestsite.com"

Logging:Level:Debug — содержит значение "Debug"

Logging:Level:Release — содержит значение "Information" Так как переменные среды так же загружаются, вы можете использовать параметры конфигурации, заданные в них:

Использование параметров из переменных среды в ASP.NET Core

Используя env.EnvironmentName можно загружать файлы конфигурации, соответствующие имени вашей среды. Если файл был помечен не обязательным, то при его отсутствии ничего не произойдёт, но если такой файл есть и содержит параметры такие же как в ранее загруженном файле, то будут использованы параметры из его, так как они загрузились в последнюю очередь. Здесь важен порядок добавления ваших файлов конфигурации, так как если значения существуют в нескольких файлах, то всегда будут использоваться значения последнего загруженного.

Готовые провайдеры конфигурации

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

.AddCommandLine(args) — позволяет передавать аргуметры из командрой строки.

.AddAzureKeyVault( $"https://{builtConfig["Vault"]}.vault.azure.net/",
builtConfig["ClientId"], builtConfig["ClientSecret"]);
— позволяет получить значения ключей из Azure хранилища.

.AddEnvironmentVariables() — читает значение ключей из процесса, в котором выполяется приложение

.AddIniFile("config.ini", optional:true, reloadOnChange: true) — позволяет работать с .ini файлами. INI файлы отлично читаются, но достаточно редко используются в web-приложениях. Для тех кто забыл, .ini файлы выглядит следующим образом:

; некоторый комментарий
# комментарий в стиле Unix

[Section1]
; комментарий о разделе
var1=значение_1 
var2=значение_2

.AddJsonFile("settings.json", optional:true, reloadOnChange:true) — провайдер для работы с JSON-файлами, работа с ним была описана выше.

.AddXmlFile("config.xml", optional:true, reloadOnChange: true) — работа с XML-файлами.

Здесь показаны не все доступные провайдеры. Но если вам необходимо использовать что-то чего нет в стандартном наборе, вы можете добавить собственный провайдер конфигурации, который будет работать с теми файлами и в том формате что вам необходимо.

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

var config = Startup.Configuration.GetSection("MySection").Get<ConfigClass>();

ConfigClass — это созданный класс, содержащий необходимые параметры конфигурации.

"MySection" — название секции в файле. Файл, в данном случае, был таким:

{
  "MySection": {
    "User": {
      "Name": "root",
      "Email": "root@mytestsite.com"
    },
    "Logging": {
      "Level": {
        "Debug": "Debug",
        "Release": "Information"
      }
    }
  }
}

Вы можете получать данные из различных секций, не обязательно из верхнеуровневой, например, дополнительно применяя GetChildren.

Итог:

Использование файлов конфигурации в проектах .NET Core стало другим. Но я бы назвал этот процесс эволюционным, так как всё шло к тому, чтобы отказаться от записи в web.config всего что только можно туда добавить. Сейчас появилось много провайдеров, позволяющих удобно работать со множествами форматов. При этом использование сторонних форматов не запрещено, для использования файла конфигурации в специфическом формате придётся только реализовать провайдер для работы с ним.

Приятного программирования.

Добавить комментарий