Содержание
При разработке приложений (не только в Blazor) важную роль играет конфигурация приложения — какие-либо настройки приложения, применяемые, например, при запуске приложения. Это могут быть такие настройки, как строки подключения к базам данных, настройки оформления окон приложения и так далее. В Blazor Server мы можем использовать несколько подходов для работы с конфигурацией приложения.
Поставщики конфигурации Blazor Server
Для конфигурации приложения мы можем использовать следующие источники:
- файлов параметров, таких как
appsettings.json
- переменные среды
- хранилище ключей Azure;
- аргументы командной строки;
- пользовательские поставщики;
- объекты .NET в памяти;
Под каждый вид источника конфигурации имеются (или разрабатываются самостоятельно) поставщики конфигурации в которых все настройки приложения хранятся в парах вида «ключ-значение». Данные по конфигурации можно получать из нескольких источников, например, из файлов json и параметров командной строки. Сегодня мы остановимся на первом пункте этого списка — работа с файлами параметров.
Файлы параметров appsettings.json
При создании приложения Blazor Server, а именно вот здесь:
var builder = WebApplication.CreateBuilder(args);
инициализируется новый экземпляр WebApplicationBuilder
, который уже содержит в себе конфигурацию по умолчанию. Чтобы получить доступ к конфигурации, мы можем воспользоваться интерфейсом IConfiguration
, например, так:
var app = builder.Build(); IConfiguration config = app.Configuration;
Если посмотреть в отладчике Visual Studio, что содержится в app.Configuration
, то можно увидеть несколько поставщиков конфигурации с настройками по умолчанию. В числе прочих, есть два поставщика, касающихся JSON:
Аналогичный провайдер также сконфигурирован на работ с файлом appsettings.Development.json
. Действия приложения при загрузке конфигурации из этих файлов следующая:
- Загружается конфигурация из файла
appsettings.json
- Загружается конфигурация из файла
appsettings.Development.json
илиappsettings.Production.json
Интерфейс IConfiguration
, в дальнейшем, позволяет нам работать с конфигурацией приложения.
Интерфейс 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 , который применяется для отслеживания изменения конфигурации |
Попробуем воспользоваться этим интерфейсом для начальной настройки приложения Blazor Server.
Конфигурация Blazor Server с использованием json-файлов
Записываем настройки в appsettings.json
Создадим новый проект Blazor Server, откроем файл appsettings.json
и добавим в него новую секцию настроек:
{ "UserOptions": { "UserName": "Вася", "UserPassword": "123456" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
Здесь у нас новая секция UserOptions
в которой записаны две настройки: имя пользователя (UserName
) и пароль (UserPassword
).
Чтение настроек в приложении Blazor Server
Прочитаем настройку UserName
из файла и выведем на главной странице приветствие. Для этого открываем файл Pages/Index.razor
и добавляем в него следующий код:
@page "/" @using Microsoft.Extensions.Configuration @inject IConfiguration Configuration @using BlazorApp1; <PageTitle>Index</PageTitle> @if (string.IsNullOrEmpty(UserName)) { <h1>Hello, anonymous</h1> } else { <h1>Hello, @UserName!</h1> } Welcome to your new app. <SurveyPrompt Title="How is Blazor working for you? " /> @code { string? UserName = string.Empty; protected override void OnInitialized() { UserName = Configuration?.GetSection("UserOptions")?.GetValue("UserName", string.Empty); } }
Разберемся с тем, что мы сейчас сделали. Во-первых, мы подключили пространство имен Microsoft.Extensions.Configuration
и внедрили в компонент объект Configuration
, используя директивы Razor
:
@using Microsoft.Extensions.Configuration @inject IConfiguration Configuration
Во-вторых, мы переопределили один из методов компонента, а именно OnInitialized()
. В этом методе мы выполнили последовательно следующие действия:
- Получили доступ к секции
UserOptions
- Получили доступ к значению настройки
UserName
.
В третьих, в разметке компонента мы добавили проверку того, что настройка прочитана и, в зависимости от результата, выводим приветствие пользователю:
@if (string.IsNullOrEmpty(UserName)) { <h1>Hello, anonymous</h1> } else { <h1>Hello, @UserName!</h1> }
Результат будет следующим:

Теперь посмотрим, какая из настроек сработает, если мы добавим точно такую же секцию, но с другими значениями настроек в файл appsettings.Development.json
. Для этого раскроем в обозревателе дерево файлов appsettings.json
и откроем необходимый файл:
Добавим в файл следующие настройки:
{ "UserOptions": { "UserName": "Иннокентий", "UserPassword": "123456" }, "DetailedErrors": true, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
Сохраним файл и снова запустим приложение. Теперь мы увидим другое приветствие:

Как можно увидеть, в соответствии с правилами работы с конфигурацией, настройки из appsettings.json были перезаписаны настройками из appsettings.Development.json
. Это позволяет нам, при необходимости, создавать различные настройки для приложения в зависимости от окружения в котором запускается приложение. Например, если вы запустите приложение вне среды Visual Studio, то настройки будут браться или из appsettings.json
или appsettings.Production.json
.
Использование шаблона параметров
Шаблон параметров использует классы для обеспечения строго типизированного доступа к группам связанных параметров. Например, мы можем записать в файл appsettings.json
различные настройки по нескольким секциям — настройки приветствия, настройки темы оформления, настройки доступа к базе данных и так далее. Для каждой секции мы можем использовать свой шаблон, разделив, тем самым задачи между различными частями программы — один компонент будет использовать доступ к БД, второй — выводить приветствие пользователю, третий — работать со стилем оформления приложения или его отдельных частей и так далее.
Более того, использование шаблона параметров позволяет сделать доступ более простым и понятным, не используя каждый раз цепочки вызовов GetSection
/GetValue
.
Класс, который будет использоваться для доступа к настройкам приложения должен обладать следующими обязательными свойствами:
- Должен быть неабстрактным с открытым конструктором без параметров.
- Должен содержать свойства с именами, соответствующими настройкам в конфигурации
- Свойства должны быть открыты для чтения и записи
Итак, наша конфигурация содержит такую секцию с настройками:
"UserOptions": { "UserName": "Вася", "UserPassword": "123456" },
Создадим класс, соответствующий этой секции. Назовем его BlazorOptions
:
public class BlazorOptions { public string? UserName { get; set; } public string? UserPassword { get; } }
Теперь привяжем этот класс к секции в файле appsettings.json
, изменив код компонента Index.razor
следующим образом:
@code { BlazorOptions? UserOptions = new(); protected override void OnInitialized() { //Configuration.GetSection("UserOptions").Bind(UserOptions); UserOptions = Configuration?.GetSection("UserOptions")?.Get<BlazorOptions>(); } }
Закомментированная строка — второй вариант привязки класса к конфигурации. Теперь мы можем использовать объект UserOptions
для работы:
@if (string.IsNullOrEmpty(UserOptions?.UserName)) { <h1>Hello, anonymous</h1> } else { <h1>Hello, @UserOptions.UserName!</h1> }
Таким образом, мы можем создавать привязки объектов .NET C# к конфигурации приложения. Теперь мы можем, например, передавать объект UserOptions
как каскадный параметр для других компонентов Blazor.
Использование своих json-файлов для конфигурации
Возможно, что вам потребуется хранить конфигурацию приложения в собственных json-файлах. Для этого мы должны добавить в список поставщиков конфигурации свой поставщик типа JsonConfigurationProvider
. Для регистрации нового поставщика необходимо зайти в файл Program.cs
и добавить следующий код:
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); //---------Добавляем нового поставщика--------// builder.Configuration.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true); //--------------------------------------------// тут код по умолчанию }
Здесь мы сделали следующее:
- Настроили новый поставщик конфигурации из JSON-файла на чтение из файла «
MyConfig.json
« - Указали, что этот файл не является обязательным
optional: true
- Указали, что при изменении файла необходимо перезагрузить настройки.
Так как мы добавляем новый провайдер конфигурации в конец списка всех провайдеров, то настройки из него будут приоритетными. То есть, если мы добавим в этот файл снова секцию UserOptions
с таким содержанием:
{ "UserOptions": { "userName": "Bob", "UserPassword": "123456" } }
то именно эти настройки будут использоваться в приложении после запуска, то есть настройки из appsettings.json
и прочих файлов по умолчанию будут перезаписаны.
Если файл будет указан как обязательный (параметр optional будет равен false), то, в случае отсутствия этого файла в папке приложения мы получим при запуске следующее исключение:
Итого
Сегодня мы рассмотрели один из вариантов работы с конфигурацией приложения Blazor Server — использование json-файлов. Конфигурация приложения загружается в строгом порядке, в зависимости от того, какие поставщики конфигурации были зарегистрированы. Что касается поставщиков, работающих с json, то здесь порядок чтения конфигурации следующий:
- Читаются настройки из файла
appsettings.json
- Если находится файл
appsettings.Development.json
илиappsettings.Production.json
то настройки перезаписываются данными из этих файлов - Если регистрируется свой json-файл конфигурации, то настройки из этого файла перезапишут данные полученные из файлов по умолчанию (перечисленные в п. 1 и 2)
Такое поведение позволяет определять настройки приложения в зависимости от окружения приложения.