Использование Configure<ApplicationOptions>
разрешает шаблон параметров .Шаблон параметров - хороший способ настроить вещи, используя различные источники конфигурации.В вашем примере вы конфигурируете ApplicationOptions
с использованием источника Microsoft.Extensions.Configuration.Но вы также можете настроить его через другие источники одновременно:
// configure using configuration
services.Configure<ApplicationOptions>(Configuration.GetSection("applicationSettings"));
// then apply a configuration function
services.Configure<ApplicationOptions>(options =>
{
// overwrite previous values
options.Foo = "bar";
});
Существует также несколько других способов настройки конфигурации, например, с помощью постконфигурации, которая позволяет легко составлять вещи, которыеиспользовать параметры, но, возможно, потребуется установить определенные значения по умолчанию или откат.
Объекты параметров будут настроены во время их использования, поэтому при вызове services.Configure()
на самом деле ничего не настраивается в это время.Вместо этого конфигурации регистрируются в контейнере DI.И затем, когда параметры будут разрешены, будут задействованы все конфигурации для определенного типа (что позволяет создавать композиции).Это позволяет опциям также поддерживать обновление конфигурации;поэтому, когда вы обновляете appsettings.json
во время выполнения, опции могут получать обновленные значения.
Чтобы использовать опции, вам нужно ввести IOptions<ApplicationOptions>
(или IOptionsSnapshot<ApplicationOptions>
, если вам нужно обновитьопции).Это обертка вокруг объекта параметров, которая будет вызывать шаблон параметров.
С другой стороны, вызов AddSingleton<ApplicationOptions>
просто регистрирует единственный экземпляр как фиксированное значение.Таким образом, то, что регистрируется у провайдера DI, это любое значение, которое Configuration.GetSection("applicationSettings").Get<ApplicationOptions>()
возвращает в этот момент .
Это дает то преимущество, что вам не нужно использовать шаблон параметров;вместо того, чтобы вводить IOptions<ApplicationOptions>
в ваши типы, вы можете просто зависеть от ApplicationOptions
напрямую.Таким образом, вы не берете зависимость от структуры параметров.Это хорошо для независимых библиотек, которые хотят использовать в различных сценариях, где шаблон параметров может быть недоступен по умолчанию.
Однако, поскольку это регистрирует фиксированный экземпляр, вы также ограничены этими точными значениями.Эти значения не могут обновляться позже при изменении источника конфигурации, а также нельзя использовать этот один источник конфигурации в сочетании с другими конфигурациями.