Разница между IOptionsMonitor и IOptionsSnapshot - PullRequest
0 голосов
/ 11 июня 2018

Согласно этот ответ , IOptionsMonitor зарегистрирован в контейнере DI как singleton и способен обнаруживать изменения посредством OnChange подписки на события.Он имеет свойство CurrentValue.

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

Использование обоих внедренных в представление, например, дает нам точно такое же поведение:

using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Options;
using UsingOptionsSample.Models;
using UsingOptionsSample.Services;

namespace UsingOptionsSample.Pages
{
    public class MyOptions
    {
        public MyOptions()
        {
            // Set default value.
            Option1 = "value1_from_ctor";
        }

        public string Option1 { get; set; }
        public int Option2 { get; set; } = 5;
    }

    public class OptionsTestModel : PageModel
    {
        private readonly MyOptions _snapshotOptions;
        private readonly MyOptions _monitorOptions;

        public OptionsTestModel(
            IOptionsMonitor<MyOptions> monitorOptionsAcessor, 
            IOptionsSnapshot<MyOptions> snapshotOptionsAccessor)
        {
            _snapshotOptions = snapshotOptionsAccessor.Value;
            _monitorOptions = monitorOptionsAcessor.CurrentValue;
        }

        public string SnapshotOptions { get; private set; }
        public string MonitorOptions { get; private set; }

        public void OnGetAsync()
        {
             //Snapshot options
            var snapshotOption1 = _snapshotOptions.Option1;
            var snapshotOption2 = _snapshotOptions.Option2;
            SnapshotOptions =
                $"snapshot option1 = {snapshotOption1}, " +
                $"snapshot option2 = {snapshotOption2}";

            //Monitor options
            var monitorOption1 = _monitorOptions.Option1;
            var monitorOption2 = _monitorOptions.Option2;
            MonitorOptions =
                $"monitor option1 = {monitorOption1}, " +
                $"monitor option2 = {monitorOption2}";
        }
    }
}

Итак, какой смысл иметь эти два интерфейса / реализацииесли они выглядят как одно и то же, просто с разным временем жизни?Код основан на этом примере , который неожиданно не включает IOptionsMonitor пример использования.

Почему у одного есть свойство "Value", а у другого - "CurrentValue", если оба получают«текущее значение» опции?

Почему / когда я должен использовать IOptionsSnapshot вместо IOptionsMonitor?

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

1 Ответ

0 голосов
/ 29 сентября 2018

В комментариях уже есть несколько довольно хороших ответов, чтобы попытаться суммировать / повторить Tseng.

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

Однако, если вам нужны опции, которые перезагружаются в singleton, IOptionsMonitor - это то, что вы должны использовать, потому что ваш singleton никогда не изменится,Хорошим примером таких сервисов являются сервисы, унаследованные от IHostedService, для длительных фоновых сервисов в Asp.net Core.

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