zoukankan      html  css  js  c++  java
  • ASP.NET Core 2.2 基础知识(七) 选项模式

    承接上一篇 配置,

    选项模式是专门用类来表示相关配置的服务.

    基本选项配置

    新建一个选项类,该类必须是包含无参数的构造函数的非抽象类.

        public class MyOptions
        {
            public MyOptions()
            {
                Id = 1;
                Name = "refuge";
            }
    
            public int Id { get; set; }
    
            public string Name { get; set; }
        }

    添加到服务容器,并绑定到配置:

        public class Startup
        {
            ......
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
                services.Configure<MyOptions>(Configuration);
            }
            ......
        }

    测试控制器:

        [Route("api/[controller]/[action]")]
        [ApiController]
        public class TestController : ControllerBase
        {
            private readonly IOptions<MyOptions> _options;
    
            public TestController(IOptions<MyOptions> options)
            {
                _options = options;
                _config = config;
            }
    
            public MyOptions Get()
            {
                return _options.Value;
            }
        }

    结果:

    通过委托配置选项

            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<MyOptions>(options =>
                {
                    //这些值会替代 MyOptions 构造函数中设置的值.
                    //原因很简单,肯定是对象创建了,才会执行这个委托.
                    options.Id = 2;
                    options.Name = "refuge2";
                });
            }

    通过文件配置简单选项

    新建一个json文件:

    {
      "Id": 3,
      "Name": "refuge3"
    }
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
                ConfigurationBuilder builder = new ConfigurationBuilder();
                IConfigurationRoot config = builder.AddJsonFile(path: @"E:GitSourceReposMyOptionDemo1jsonconfig.json", optional: true, reloadOnChange: true).Build();
                services.Configure<MyOptions>(config);
            }

    还可以读取文件中的某个节点配置简单选项

    修改 json 文件,增加 subsection 节点.

    {
      "Id": 3,
      "Name": "refuge3",
      "SubSection": {
        "Id": 4,
        "Name": "refuge4"
      } 
    }
            public void ConfigureServices(IServiceCollection services)
            {
                ConfigurationBuilder builder = new ConfigurationBuilder();
                IConfigurationRoot config = builder.AddJsonFile(@"E:GitSourceReposMyOptionDemo1jsonconfig.json", true, true).Build();
                services.Configure<MyOptions>(config.GetSection("subsection"));
            }

    上面这些例子中的获取到的 MyOptions 对象都是单例的.比如通过文件配置简单选项,即使 AddJsonFile 方法最后一个参数是 true ,配置数据也不会更新.要实现更新需要使用下面这个接口.

    通过 IOptionsSnapshot 重新加载配置数据

    修改 TestController :

    [Route("api/[controller]/[action]")]
        [ApiController]
        public class TestController : ControllerBase
        {
            private readonly IOptionsSnapshot<MyOptions> _options;
    
            public TestController(IOptionsSnapshot<MyOptions> options)
            {
                _options = options;           
            }
            public MyOptions Get()
            {
                return _options.Value;
            }
    }

    第一次请求:

    修改 json 文件后,刷新页面

    通过别名配置选项

            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
                services.Configure<MyOptions>("option1", Configuration);
                services.Configure<MyOptions>("option2", options =>
                {
                    options.Id = 6;
                    options.Name = "refuge6";
                });
            }

    修改 TestController 

        [Route("api/[controller]/[action]")]
        [ApiController]
        public class TestController : ControllerBase
        {
            private readonly IOptionsSnapshot<MyOptions> _options;
    
            public TestController(IOptionsSnapshot<MyOptions> options)
            {
                _options = options;
            }
    
            public IEnumerable<MyOptions> Get()
            {
                for (int i = 1; i < 3; i++)
                {
                    yield return _options.Get("option" + i);
                }
            }
        }

    当启用多个配置服务时,指定的最后一个配置源优于其他源.

    未完待续...

  • 相关阅读:
    PHP多台服务器跨域SESSION共享
    php发送post请求到nodejs服务器
    xampp使用phpunit
    MarkdownPad 2
    php安装memcache注意事项
    yii 基础版用rbac-plus
    yii2高级版账号密码问题
    yii2 rbac-plus的使用
    manjaro-VM虚拟机vmmon错误
    Java并发包中的线程池ThreadPoolExecutor
  • 原文地址:https://www.cnblogs.com/refuge/p/10226271.html
Copyright © 2011-2022 走看看