services.Configure <> () или services.AddSingleton (). Get ()? - PullRequest
0 голосов
/ 22 ноября 2018

Как известно, есть два способа получить классы параметров в ASP.NET Core 2:

  1. Использование services.Configure<>(), например:

    services.AddOption();
    services.Configure<ApplicationOptions>(Configuration.GetSection("applicationSettings"));
    
  2. или использование services.AddSingleton(Configuration.Get()), например:

    services.AddSingleton(Configuration.GetSection("applicationSettings")
        .Get<ApplicationOptions>());
    

Но какие преимущества или недостатки имеют эти разные подходы?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Использование 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 напрямую.Таким образом, вы не берете зависимость от структуры параметров.Это хорошо для независимых библиотек, которые хотят использовать в различных сценариях, где шаблон параметров может быть недоступен по умолчанию.

Однако, поскольку это регистрирует фиксированный экземпляр, вы также ограничены этими точными значениями.Эти значения не могут обновляться позже при изменении источника конфигурации, а также нельзя использовать этот один источник конфигурации в сочетании с другими конфигурациями.

0 голосов
/ 22 ноября 2018

Краткий ответ: 1-й способ добавляет Options, а 2-й способ регистрирует простой одноэлементный сервис .

Я всегда предпочитаю Шаблон параметров , если это возможно.

За кулисами Configure<TOptions>() вызовет services.AddSingleton<>(), чтобы зарегистрировать одноэлементную службу для настройки параметров.Тем не менее, Чтобы настроить параметры, мы всегда должны использовать 1-й способ. Поскольку Configure<TOptions>(config) (и все виды других configure<>() методов) сделает всю тяжелую работу за нас.:

  1. Например, если мы хотим сохранить два разных экземпляра для одного и того же типа, как мы можем сделать это с простым одноэлементным сервисом?На самом деле, это именно то, что делают именованные параметры.

  2. Кроме того, сложно автоматически перезагрузить однотонную службу в соответствии с изменением файла на applicationSettings.json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...