Паттерн Options. Начало
Паттерн Options помогает связывать конфигурацию приложения со строго типизированными классами. Преимущество этого подхода перед получением каждого свойства конфигурации по отдельности (помимо сокращения объёма кода) в том, что есть возможность группировать связанные свойства, а также производить валидацию свойств.
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}public class PositionOptions {
public const string Position = "Position";
public string Title { get; set; }
public string Name { get; set; }
}Заметьте, что используется статическая переменная Position с путём к секции конфигурации (в данном случае
"Position"), чтобы избежать опечаток (см. ниже). Получить значение в коде можно через внедрение зависимости IConfiguration:private readonly IConfiguration _configuration;
Далее либо через вызов метода
ConfigurationBinder.Bind:var positionOptions = new PositionOptions(); _configuration.GetSection(PositionOptions.Position)
.Bind(positionOptions);
либо через вызов метода
ConfigurationBinder.Get<T>:positionOptions =
_configuration
.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
Кроме того, можно добавить регистрацию параметров в сервисы:
public void ConfigureServices(IServiceCollection services) {
services.Configure<PositionOptions>(
Configuration.GetSection(
PositionOptions.Position));
// либо
services.AddOptions<PositionOptions>()
.Bind(Configuration.GetSection(
PositionOptions.Position));
…
}И использовать через внедрение зависимости:
private readonly PositionOptions _options;
public TestModel(IOptions<PositionOptions> options) {
_options = options.Value;
}
Обновление значений
Что если нам нужно обновлять значения параметров во время работы приложения?
IOptions<T> устанавливается как Singleton в контейнере DI. Значения параметров устанавливаются при первом обращении к ним, и не могут быть изменены без рестарта. Именованные параметры (о них далее) не поддерживаются.В этом случае вместо
IOptions<T> можно использовать один из двух вариантов:1. IOptionsSnapshot<T>
Поддерживает перезагрузку параметров и именованные параметры. Регистрируется как Scoped сервис. Поэтому обновлённые значения параметров будут доступны при следующем запросе к приложению. Однако из-за регистрации как Scoped,
IOptionsSnapshot<T> не может быть внедрён в Singleton сервисы.2. IOptionsMonitor<T>
Поддерживает перезагрузку параметров и именованные параметры. Регистрируется как Singleton сервис. Значения параметров доступны через
options.CurrentValue (в отличие от Value в предыдущих случаях). Кроме того, поддерживается метод OnChange, в котором регистрируется делегат, обновляющий значения в коде при изменении конфигурации, а также, например, делающий запись в лог.Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/dotnet-core-aspnet-core-configuration-options/