Конфигурация приложений Blazor с использованием JSON-файлов

При разработке приложений (не только в 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:

IConfiguration

Аналогичный провайдер также сконфигурирован на работ с файлом appsettings.Development.json. Действия приложения при загрузке конфигурации из этих файлов следующая:

  1. Загружается конфигурация из файла appsettings.json
  2. Загружается конфигурация из файла 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(). В этом методе мы выполнили последовательно следующие действия:

  1. Получили доступ к секции UserOptions
  2. Получили доступ к значению настройки UserName.

В третьих, в разметке компонента мы добавили проверку того, что настройка прочитана и, в зависимости от результата, выводим приветствие пользователю:

@if (string.IsNullOrEmpty(UserName))
{
    <h1>Hello, anonymous</h1>
}
else
{
    <h1>Hello, @UserName!</h1>
}

Результат будет следующим:

Чтение конфигурации Blazor
Чтение конфигурации Blazor Server

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

appsettings.jsonДобавим в файл следующие настройки:

{
  "UserOptions": {
    "UserName": "Иннокентий",
    "UserPassword": "123456"
  },
  "DetailedErrors": true,
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

Сохраним файл и снова запустим приложение. Теперь мы увидим другое приветствие:

appsettings.Development.json
appsettings.Development.json

 

Как можно увидеть, в соответствии с правилами работы с конфигурацией, настройки из 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);
    //--------------------------------------------//
                тут код по умолчанию 
         }

Здесь мы сделали следующее:

  1. Настроили новый поставщик конфигурации из JSON-файла на чтение из файла «MyConfig.json«
  2. Указали, что этот файл не является обязательным optional: true
  3. Указали, что при изменении файла необходимо перезагрузить настройки.

Так как мы добавляем новый провайдер конфигурации в конец списка всех провайдеров, то настройки из него будут приоритетными. То есть, если мы добавим в этот файл снова секцию UserOptions с таким содержанием:

{
  "UserOptions": {
    "userName": "Bob",
    "UserPassword": "123456"
  }
}

то именно эти настройки будут использоваться в приложении после запуска, то есть настройки из appsettings.json и прочих файлов по умолчанию будут перезаписаны.

Если файл будет указан как обязательный (параметр optional будет равен false), то, в случае отсутствия этого файла в папке приложения мы получим при запуске следующее исключение:

System.IO.FileNotFoundException: «The configuration file ‘MyConfig.json’ was not found and is not optional. The expected physical path was %путь_к_папке_приложения%»

Итого

Сегодня мы рассмотрели один из вариантов работы с конфигурацией приложения Blazor Server — использование json-файлов. Конфигурация приложения загружается в строгом порядке, в зависимости от того, какие поставщики конфигурации были зарегистрированы. Что касается поставщиков, работающих с json, то здесь порядок чтения конфигурации следующий:

  1. Читаются настройки из файла appsettings.json
  2. Если находится файл appsettings.Development.json или appsettings.Production.json то настройки перезаписываются данными из этих файлов
  3. Если регистрируется свой json-файл конфигурации, то настройки из этого файла перезапишут данные полученные из файлов по умолчанию (перечисленные в п. 1 и 2)

Такое поведение позволяет определять настройки приложения в зависимости от окружения приложения.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии