Репост из: .NET Разработчик
День шестьсот восьмой. #ЗаметкиНаПолях
Паттерн Options. Продолжение
Начало
Извлечение в интерфейс
Чтобы не использовать внедрения вроде IOptions или IOptionsSnapshot в классах приложения, можно выделить параметры в интерфейс
public class PositionOptions : IPositionOptions {
public const string Position = "Position";
public string Title { get; set; }
public string Name { get; set; }
}
public interface IPositionOptions {
string Title { get; }
string Name { get; }
}
Затем зарегистрируем интерфейс в сервисах, используя фабрику:
services.Configure(
Configuration.GetSection("Position"));
services.AddSingleton(
sp => sp.GetRequiredService<
IOptions>().Value);
И используем готовый интерфейс:
public TestModel(IPositionOptions options) {
_options = options;
}
Именованные параметры
Именованные параметры полезны, когда несколько разделов конфигурации привязаны к одним и тем же свойствам. Например:
"ContactUs": {
"Manager": {
"Name": "Joe Smith",
"Phone": "555-01-01"
},
"CEO": {
"Name": "Jane Smith",
"Phone": "555-02-02"
}
}
public class ContactSettings {
public string Name { get; set; }
public string Phone { get; set; }
}
Тогда можно использовать перегруженную версию метода Configure, принимающую строковое имя:
services.
Configure("Manager",
Configuration.GetSection(
"ContactUs:Manager"));
services.Configure("CEO",
Configuration.GetSection("ContactUs:CEO"));
Получить значения параметров из сервиса можно, передав имя набора в метод Get:
private readonly ContactSettings _manager;
private readonly ContactSettings _ceo;
public TestNamed(
IOptionsSnapshot options) {
_manager = options.Get("Manager");
_ceo = options.Get("CEO");
}
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/dotnet-core-aspnet-core-configuration-options/
Паттерн Options. Продолжение
Начало
Извлечение в интерфейс
Чтобы не использовать внедрения вроде IOptions или IOptionsSnapshot в классах приложения, можно выделить параметры в интерфейс
public class PositionOptions : IPositionOptions {
public const string Position = "Position";
public string Title { get; set; }
public string Name { get; set; }
}
public interface IPositionOptions {
string Title { get; }
string Name { get; }
}
Затем зарегистрируем интерфейс в сервисах, используя фабрику:
services.Configure(
Configuration.GetSection("Position"));
services.AddSingleton(
sp => sp.GetRequiredService<
IOptions>().Value);
И используем готовый интерфейс:
public TestModel(IPositionOptions options) {
_options = options;
}
Именованные параметры
Именованные параметры полезны, когда несколько разделов конфигурации привязаны к одним и тем же свойствам. Например:
"ContactUs": {
"Manager": {
"Name": "Joe Smith",
"Phone": "555-01-01"
},
"CEO": {
"Name": "Jane Smith",
"Phone": "555-02-02"
}
}
public class ContactSettings {
public string Name { get; set; }
public string Phone { get; set; }
}
Тогда можно использовать перегруженную версию метода Configure, принимающую строковое имя:
services.
Configure("Manager",
Configuration.GetSection(
"ContactUs:Manager"));
services.Configure("CEO",
Configuration.GetSection("ContactUs:CEO"));
Получить значения параметров из сервиса можно, передав имя набора в метод Get:
private readonly ContactSettings _manager;
private readonly ContactSettings _ceo;
public TestNamed(
IOptionsSnapshot options) {
_manager = options.Get("Manager");
_ceo = options.Get("CEO");
}
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/dotnet-core-aspnet-core-configuration-options/