.NetCore之选项模式Options使用

博客 分享
0 144
优雅殿下
优雅殿下 2022-03-03 23:56:05
悬赏:0 积分 收藏

.Net Core之选项模式Options使用

一、简要阐述

ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个对象,这个对象就叫做Options对象。也可以叫做配置对象。

引入NuGet包:Microsoft.Extensions.Options

 

二、使用场景

  1. IOptions
  • 不支持
    • 在应用启动后读取配置数据。
    • 命名选项
  • 注册为单一实例,可以注入到任何服务生存期。
  1. IOptionsSnapshot
  • 作用域容器配置热更新使用它
  • 注册为范围内,因此无法注入到单一实例服务
  • 支持命名选项
  1. IOptionsMonitor
  • 用于检索选项并管理 TOptions 实例的选项通知。
  • 注册为单一实例且可以注入到任何服务生存期。
  • 支持
    • 更改通知
    • 命名选项
    • 可重载配置
    • 选择性选项失效

使用 IOptionsSnapshot 读取已更新的数据

IOptionsMonitor 和 IOptionsSnapshot 之间的区别在于:

  • IOptionsMonitor 是一种单一示例服务,可随时检索当前选项值,这在单一实例依赖项中尤其有用。
  • IOptionsSnapshot 是一种作用域服务,并在构造 IOptionsSnapshot 对象时提供选项的快照。 选项快照旨在用于暂时性和有作用域的依赖项。

三、代码实例

1、实体类

public class MyOptionSetting    {        /// <summary>        /// 姓名        /// </summary>        public string UserName { get; set; }        /// <summary>        /// 年龄        /// </summary>        public int Age { get; set; }        /// <summary>        /// 电话        /// </summary>        public string Phone { get; set; }        /// <summary>        /// 性别        /// </summary>        public string Sex { get; set; }    }

 

2、控制器层

public class HomeController : Controller    {        private readonly ILogger<HomeController> _logger;        private readonly IOptions<MyOptionSetting> _options;        private readonly IOptionsSnapshot<MyOptionSetting> _optionsSnapshot;        private readonly IOptionsMonitor<MyOptionSetting> _optionsMonitor;        public HomeController(ILogger<HomeController> logger            , IOptions<MyOptionSetting> options            , IOptionsSnapshot<MyOptionSetting> optionsSnapshot            , IOptionsMonitor<MyOptionSetting> optionsMonitor)        {            _logger = logger;            _options = options;            _optionsSnapshot= optionsSnapshot;            _optionsMonitor = optionsMonitor;            _optionsMonitor.OnChange(ChangeListener);        }        /// <summary>        /// 当选项模式是IOptionsMonitor ,修改配置文件appsetting.json保存时候会触发OnChange事件        /// </summary>        /// <param name="options"></param>        private void ChangeListener(MyOptionSetting options)        {            Console.WriteLine(options.Age);        }        public IActionResult Index()        {            {                // 获取UserName字段名信息                var options = _options.Value.UserName;                _logger.LogInformation($"options获取UserName字段名信息:{options}");                // 获取MyOptionSetting所有配置信息                var optionJson = JsonConvert.SerializeObject(_options.Value);                _logger.LogInformation($"options获取MyOptionSetting所有配置信息:{optionJson}");            }            {                // 获取UserName字段名信息                var optionSnapshot = _optionsSnapshot.Value.UserName;                _logger.LogInformation($"optionSnapshot获取UserName字段名信息:{optionSnapshot}");                // 获取MyOptionSetting所有配置信息                var optionSnapshotJson = JsonConvert.SerializeObject(_optionsSnapshot.Value);                _logger.LogInformation($"options获取MyOptionSetting所有配置信息:{optionSnapshotJson}");            }            {                // 获取UserName字段名信息                var optionsMonitor = _optionsMonitor.CurrentValue.UserName;                _logger.LogInformation($"optionsMonitor获取UserName字段名信息:{optionsMonitor}");                // 获取MyOptionSetting所有配置信息                var optionsMonitorJson = JsonConvert.SerializeObject(_optionsMonitor.CurrentValue);                _logger.LogInformation($"optionsMonitor获取MyOptionSetting所有配置信息:{optionsMonitorJson}");            }            return View();        }        public IActionResult Privacy()        {            return View();        }    }

3、Startup类ConfigureServices方法注入配置

public void ConfigureServices(IServiceCollection services)        {            services.AddControllersWithViews();            // 注入            services.Configure<MyOptionSetting>(Configuration.GetSection("MyOptionSetting"));        }

4、appsettings.json文件配置

  "MyOptionSetting": {    "UserName": "xiaohemiao",    "Age": 19,    "Phone": "10086",    "Sex": "nan"  }

四、效果呈现

 

 

 五、划重点,最通俗的理解

1、使用IOptions,当程序正在运行中时,修改appsettings.json之后,刷新页面,页面读取的配置信息不会改变,读取的还是原来的配置信息。

2、使用IOptionsSnapshot,当程序正在运行中时,修改appsettings.json之后,刷新页面,页面读取的配置信息是最新的信息。

3、使用IOptionsMonitor,当程序正在运行中时,修改appsettings.json之后,刷新页面,页面读取的配置信息是最新的;当在页面中使用了监听事件,修改appsettings.json保存的时候会自动触发如上的OnChange事件,且读取的配置是最新的。

posted @ 2022-03-03 23:07 SportSky 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员