Если мы говорим о файлах конфигурации в 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, выбрать нужный профиль и записать нужные значения:
Использовании параметров конфигурации
Если вы хотите использовать записанные параметры конфигурации в других классах, помимо Startup
, будет удобно пометить её как static
public static IConfiguration Configuration { get; set; }
Тогда использовать можно будет следующим образом:
var email = Startup.Configuration["User:Email"];
Сам 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" Так как переменные среды так же загружаются, вы можете использовать параметры конфигурации, заданные в них:
Используя 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 всего что только можно туда добавить. Сейчас появилось много провайдеров, позволяющих удобно работать со множествами форматов. При этом использование сторонних форматов не запрещено, для использования файла конфигурации в специфическом формате придётся только реализовать провайдер для работы с ним.
Приятного программирования.