Согласно этот ответ , 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
?
Не думаю, что я понял это правильно, я должен отсутствоватьнекоторые очень важные аспекты, касающиеся внедрения этих зависимостей.