欢迎光临
个人技术文档整理

.NetCore配置文件-IOptions,IOptionsMonitor,IOptionsSnapshot之间的区别(二)

ASP.NET Core中可以使用Options模式,从而能够使用强类型的类来表达配置项,这也是实现配置的最佳实践。
对外提供的配置项接口有IOptions<TOptions>,IOptionsMonitor<TOptions>,IOptionsSnapshot<TOptions>,这三种适用于不同的场景:

  • IOptions<TOptions>  单例,不支持数据变化(重启更新),性能高
  • IOptionsMonitor<TOptions> 单例,实时变更(侦听器OnChange)
  • IOptionsSnapshot<TOptions> 作用域注册,单次请求内不变

 

举个例子

1、appsettings.json

{
  "AppSettings": {
    "SystemName": "我的网站---1111"
  }
}

2、实体

public class Configs
    { 
        public Dictionary<string, string> AppSettings { get; set; }

    }

3、在Startup中的ConfigureServices方法中注册服务

services.Configure<Configs>(Configuration);

4、控制器代码

        //单例,不支持数据变化(重启更新),性能高
        private readonly IOptions<Configs> _OptConfig; 
        //单例,实时变更(侦听器OnChange) 
        private readonly IOptionsMonitor<Configs> _OptMonitorConfig;
        //作用域注册,单次请求内不变
        private readonly IOptionsSnapshot<Configs> _OptSnapshotConfig;



        public HomeController(IOptions<Configs> optConfig, IOptionsMonitor<Configs> optMonitorConfig, IOptionsSnapshot<Configs> optSnapshotConfig)
        {
            this._OptConfig = optConfig;
            this._OptMonitorConfig = optMonitorConfig;
            this._OptSnapshotConfig = optSnapshotConfig;
        }

        public IActionResult Index()
        {
            //修改前 【我的网站---1111】
            ViewBag.SystemName1 = _OptConfig.Value.AppSettings["SystemName"];
            ViewBag.SystemName2 = _OptMonitorConfig.CurrentValue.AppSettings["SystemName"];
            ViewBag.SystemName3 = _OptSnapshotConfig.Value.AppSettings["SystemName"];

            Thread.Sleep(3000);//休息3秒---去修改文件值 【我的网站---2222】

            ViewBag.SystemName1_2 = _OptConfig.Value.AppSettings["SystemName"];
            ViewBag.SystemName2_2 = _OptMonitorConfig.CurrentValue.AppSettings["SystemName"];
            ViewBag.SystemName3_2 = _OptSnapshotConfig.Value.AppSettings["SystemName"];

            return View();
        }

5、Index.cshtml

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">  
    <div>
        <h2>修改前【我的网站---1111】</h2>
        <p>IOptions=@ViewBag.SystemName1</p>
        <p>IOptionsMonitor=@ViewBag.SystemName2</p>
        <p>IOptionsSnapshot=@ViewBag.SystemName3</p>
    </div>

      <div>
        <h2>修改后 【我的网站---2222】</h2>
        <p>IOptions=@ViewBag.SystemName1_2</p>
        <p>IOptionsMonitor=@ViewBag.SystemName2_2</p>
        <p>IOptionsSnapshot=@ViewBag.SystemName3_2</p>
    </div> 
</div>

执行结果

  • 第一次查看页面(修改appsettings.json文件
  • 第二次查看页面(不修改appsettings.json)

 

结论

 

  • 经常修改-配置文件:
    那么首先考虑IOptionsMonitor<>,如果不合适接着考虑IOptionsSnapshot<>

      IOptionsMonitor  在耗时操作的同一个请求中,值可能存在不一致的情况—当你正在修改配置文件的时候——可能会引发一些奇怪的bug(出现的概率小)。
  • 不经常修改-配置文件:
    可以考虑 IOptions<> ,性能最高

 

赞(2)