Важную роль в приложении играет конфигурация. Под конфигурацией обычно понимаются какие-либо настройки приложения, применяемые, например, при запуске приложения. Это могут быть такие настройки, как строки подключения к базам данных, настройки оформления окон приложения, включение каких-либо опций и т.д. В ASP.NET Core мы можем использовать несколько подходов для работы с конфигурацией.
Поставщики конфигурации
Для конфигурации приложения ASP.NET Core мы можем использовать следующие источники:
- JSON-файлы параметров, например
appsettings.json - переменные среды
- хранилище ключей Azure;
- аргументы командной строки;
- пользовательские поставщики конфигурации;
- объекты .NET в памяти;
Под каждый вид источника конфигурации имеются (или разрабатываются самостоятельно) поставщики конфигурации в которых все настройки приложения хранятся в парах вида «ключ-значение». Данные по конфигурации можно получать из нескольких источников, например, из файлов json и параметров командной строки.
Интерфейс IConfiguration
Интерфейс IConfiguration представляет конфигурацию приложения и выглядит следующим образом:
public interface IConfiguration
{
string? this[string key] { get; set; }
IConfigurationSection GetSection(string key);
IEnumerable<IConfigurationSection> GetChildren();
IChangeToken GetReloadToken();
}
Элементы интерфейса следующие:
| Элемент | Тип | Описание |
string? this[string key] |
свойство-индексатор | позволяет считывать или записывать настройку в виде пары «ключ-значение» |
GetSection(string key) |
метод | возвращает отдельную секцию конфигурации, соответствующую параметру key |
GetChildren() |
метод | возвращает набор подсекций текущей секции конфигурации в виде объекта IEnumerable<IConfigurationSection> |
GetReloadToken() |
метод | возвращает объект IChangeToken, который применяется для отслеживания изменения конфигурации |
Чтобы получить конфигурацию приложения в виде объекта, реализующего интерфейс IConfiguration, мы можем воспользоваться свойством объекта WebApplication.Configurationили же запросить конфигурацию приложения через механизм Dependency Injection.
Например, воспользуемся вторым способом и перечислим все настройки приложения ASP.NET Core:
app.MapGet("/",(IConfiguration configuration) =>
{
StringBuilder sb = new StringBuilder();
foreach (var pair in configuration.AsEnumerable())
{
sb.AppendLine($"{pair.Key} - {pair.Value}");
}
return sb.ToString();
});
в результате мы увидим следующий вывод:
Также, запросив объект конфигурации мы можем устанавливать собственные настройки для приложения. Например,
app.MapGet("/",(IConfiguration configuration) =>
{
configuration["StartPage"] = "/tasks";
configuration["Language"] = "RU-ru";
StringBuilder sb = new StringBuilder();
foreach (var pair in configuration.AsEnumerable())
{
sb.AppendLine($"{pair.Key} - {pair.Value}");
}
return sb.ToString();
});
Здесь мы указали два элемента конфигурации: StartPage со значением /tasks и Language со значением RU-ru. Указанные настройки будут сохранены в словаре:
Для получения настройки не обязательно передирать весь словарь — достаточно запросить необходимую настройку по её ключу:
app.MapGet("/",(IConfiguration configuration) =>
{
configuration["StartPage"] = "/tasks";
configuration["Language"] = "RU-ru";
StringBuilder sb = new StringBuilder();
sb.AppendLine(configuration["windir"]);
sb.AppendLine(configuration["StartPage"]);
sb.AppendLine(configuration["Language"]);
return sb.ToString();
});
результат представлен на рисунке ниже
Добавление источника конфигурации
Перечень настроек приложения может насчитывать различное количество элементов. Более того, каждая настройка может иметь сложную структуру. В этом случае, удобно передавать в приложение настройки не по отдельности, а в составе какого-либо объекта. Чтобы это сделать, мы можем воспользоваться свойством Configuration объекта WebApplicationBuilder, которое представляет собой менеджер конфигураций (ConfigurationManager) и содержит ряд методов добавления новых источников конфигурации в приложение. Например,
var builder = WebApplication.CreateBuilder(args);
IEnumerable<KeyValuePair<string, string>> values = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("StartPage", "/tasks"),
new KeyValuePair<string, string>("Language", "RU-ru"),
};
builder.Configuration.AddInMemoryCollection(values);
здесь в качестве источника конфигурации мы использовали список List<KeyValuePair<string, string>>, который передали в метод расширения AddInMemoryCollection. Таким образом мы получим конфигурацию приложения, как показано на рисунке выше.
Стоит отметить, что ConfigurationManager реализует также интерфейс IConfigurationBuilder у которого, помимо метода AddInMemoryCollection определено достаточно много методов расширения, позволяющих добавлять в качестве источника конфигурации Ini-файлы, json-файлы и т.д.
Итого
Конфигурация в ASP.NET Core используется для первоначальной настройки приложения. В качестве источников конфигурации могут использоваться параметры командной строки, файлы различных форматов, а также классы .NET. Для получения доступа к конфигурации мы можем использовать свойство WebApplication.Configuration или использовать механизм DI для запроса сервиса конфигурации, например в конечных точках приложения. Также мы можем добавлять собственные источники конфигурации, используя свойство WebApplicationBuilder.Configuration.

