• .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($"optionSnapshot获取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事件,且读取的配置是最新的。

  • 相关阅读:
    Spring AOP原理
    Spring Boot引入Oracle Jar
    Cookie
    资源验证
    HTTP各种特性
    高性能网络编程之IO和NIO阻塞分析
    Http协议基础及发展历史
    Http原理与实践
    设计模式-回顾
    http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
  • 原文地址:https://www.cnblogs.com/sportsky/p/15962402.html
Copyright © 2020-2023  润新知