.Net|.Net Core之选项模式Options使用
一、简要阐述
ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个对象,这个对象就叫做Options对象。也可以叫做配置对象。
【.Net|.Net Core之选项模式Options使用】引入NuGet包:Microsoft.Extensions.Options
二、使用场景
- IOptions
- 不支持
- 在应用启动后读取配置数据。
- 命名选项
- 注册为单一实例,可以注入到任何服务生存期。
- IOptionsSnapshot
- 作用域容器配置热更新使用它
- 注册为范围内,因此无法注入到单一实例服务
- 支持命名选项
- IOptionsMonitor
- 用于检索选项并管理 TOptions 实例的选项通知。
- 注册为单一实例且可以注入到任何服务生存期。
- 支持
- 更改通知
- 命名选项
- 可重载配置
- 选择性选项失效
IOptionsMonitor 和 IOptionsSnapshot 之间的区别在于:
- IOptionsMonitor 是一种单一示例服务,可随时检索当前选项值,这在单一实例依赖项中尤其有用。
- IOptionsSnapshot 是一种作用域服务,并在构造 IOptionsSnapshot 对象时提供选项的快照。 选项快照旨在用于暂时性和有作用域的依赖项。
public class MyOptionSetting { /// /// 姓名 /// public string UserName { get; set; } /// /// 年龄 /// public int Age { get; set; } /// /// 电话 /// public string Phone { get; set; } /// /// 性别 /// public string Sex { get; set; } }
2、控制器层
public class HomeController : Controller { private readonly ILogger _logger; private readonly IOptions_options; private readonly IOptionsSnapshot _optionsSnapshot; private readonly IOptionsMonitor _optionsMonitor; public HomeController(ILogger logger , IOptions options , IOptionsSnapshot optionsSnapshot , IOptionsMonitor optionsMonitor) { _logger = logger; _options = options; _optionsSnapshot= optionsSnapshot; _optionsMonitor = optionsMonitor; _optionsMonitor.OnChange(ChangeListener); }/// /// 当选项模式是IOptionsMonitor ,修改配置文件appsetting.json保存时候会触发OnChange事件 /// /// 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(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事件,且读取的配置是最新的。
推荐阅读
- Python|Python "爬虫"出发前的装备之二数据先行( Requests 模块)
- Linux性能优化实战CPU篇之总结(四)
- leetcode|LeetCode --- 经典算法题之二分查找三回合
- 带你了解Java数据结构和算法之前缀|带你了解Java数据结构和算法之前缀,中缀和后缀表达式
- 字符串压缩(一)之ZSTD
- LR.Net解放程序员双手的代码生成器
- 从头学习C语言之字符串处理函数
- C++算法设计之马踏棋盘的实现
- Java集合框架之Set和Map详解
- C语言修炼之路函数篇真题训练上