IOptionsMonitor 与 IOptionsSnapshot 之间的区别

2024-03-14

根据这个答案 https://stackoverflow.com/a/46570073/1987788, IOptionsMonitor在 DI 容器中注册为单例并且能够通过以下方式检测变化OnChange事件订阅。它有一个CurrentValue财产。

另一方面,IOptionsSnapshot注册为scoped并且还具有通过读取每个请求的最后选项来进行更改检测的功能,但它不具备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}";
        }
    }
}

那么,如果这两个接口/实现看起来像相同的东西,只是具有不同的生命周期,那么它们有什么意义呢?代码是基于此样本 https://github.com/aspnet/Docs/tree/master/aspnetcore/fundamentals/configuration/options/sample,令人惊讶的是,其中不包括IOptionsMonitor使用示例。

如果两者都返回选项的“当前值”,为什么一个具有“Value”属性而另一个具有“CurrentValue”?

为什么/什么时候应该使用IOptionsSnapshot代替IOptionsMonitor?

我认为我没有弄清楚,我一定错过了有关这些和依赖项注入的一些非常重要的方面。


IOptionsMonitor is a 单例服务随时检索当前选项值,这在单例依赖项中特别有用。

IOptionsSnapshot is a 范围服务并提供了一个snapshot当时的选项IOptionsSnapshot<T>对象被构造。期权快照设计用于短暂的 and scoped依赖关系。

Use IOptions<T>当你不期望你的配置值 改变。使用IOptionsSnaphot<T>当你期望你的价值观 更改但希望它在整个请求中保持一致。使用IOptionsMonitor<T>当您需要实时值时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOptionsMonitor 与 IOptionsSnapshot 之间的区别 的相关文章

随机推荐