您现在的位置是:首页 > 编程语言学习 > 后端编程语言 > 文章正文 后端编程语言

.Net Core配置文件读取IOptions,IOptionsMonitor,IOptionsSnapshot

2022-09-03 11:48:09 后端编程语言

简介众所周知,appsetting.json 配置文件是.Net 的重大革新之心,抛开了以前繁杂的xml文件,使用了更简洁易懂的json方式,简直不要太舒服了!...

众所周知,appsetting.json 配置文件是.Net 的重大革新之心,抛开了以前繁杂的xml文件,使用了更简洁易懂的json方式,简直不要太舒服了!东西虽然好,但怎么在程序中读取这个配置呢,是每个新手必须要跨过去的坑(当然也是包括我这个菜狗子)。

遇事不明上注入,只要是遇到不知道怎么办的事,首先要往注入方便想,框架有了这个配置文件,必然配备了简单直接的读取API,按照我的习惯,直接上代码:

首先,我们在配置文件中,增加 Demo 配置节点:

  1.   "Logging": { 
  2. "LogLevel": { 
  3.   "Default""Information"
  4.   "Microsoft.AspNetCore""Warning" 
  5.   }, 
  6.   "Demo": { 
  7. "Value1""1"
  8. "Value2""2"
  9. "Value3""3"
  10. "Value4""4" 
  11.   } 

在需要用到配置文件的地方,注入 IConfiguration 服务接口

  1. private readonly IConfiguration _configuration; 
  2.  
  3. public ValuesController(IConfiguration configuration) 
  4. _configuration = configuration; 

通常,我们比较直接的方式是通过GetSection 获取对应的配置节点,然后再获取对应的配置项

  1. var section = _configuration.GetSection("Demo"); 
  2. var value1 = section.GetValue("Value1""1"); 

如果 Demo 节点内还有更深的节点,GetSection 可以通过 : 深入到对应的下一个节点

appsetting.json

  1.   "Logging": { 
  2. "LogLevel": { 
  3.   "Default""Information"
  4.   "Microsoft.AspNetCore""Warning" 
  5.   }, 
  6.   "Demo": { 
  7. "Value1""1"
  8. "Value2""2"
  9. "Value3""3"
  10. "Value4""4"
  11. "Model" { 
  12.   "Name""小二"
  13.   "Phone""12345678911" 
  14.   } 
  15. var model = _configuration.GetSection("Demo:Model"); 

有些小伙伴可能就会问了,那我每个需要用到的地方都需要直接以字符串作为参数去读取配置,以后要是突然改了配置项,岂不是非常麻烦;

这点小伙伴们大可放心,你可以定义一个实体类,然后绑定上去,以后有什么更改了,直接重命名对应的属性就行了,实例代码

方法一:

  1. var options = new DemoOptions(); 
  2. _configuration.GetSection("Demo").Bind(options); 

方法二:


  1. var options2 = _configuration.GetSection("Demo").Get<DemoOptions>(); 

方法三:在 Startup.cs、.Net 6 以上在 Program.cs- 中使用依赖注入方式,以下是 .Net 6


  1. builder.Services.Configure<DemoOptions>(builder.Configuration.GetSection("Demo")); 

在需要使用的地方注入IOptions<TOptions> 即可获取到配置值,需要注意的是,IOptions 是单例(Singleton)服务,即在应用启动时进行注册,后续更改配置文件,该 IOptions 将不会同步更新,依然还是旧值

  1. private readonly DemoOptions _demoOptions; 
  2. public ValuesController(IOptions<DemoOptions> options) 
  3. _demoOptions = options.Value; 

如需要配置进行热更新,只需要改成注入IOptionsMonitor<TOptions> 或者IOptionsSnapshot<TOptions>;IOptionsSnapshot<TOptions>的生命周期是作用域(Scoped),每次请求都会重新获取一次配置;IOptionsSnapshot<TOptions> 的生命周期是单例(Singleton),与IOptions<TOptions> 不一样的是当配置文件发生改变时,将会自动同步响应。

相关文章

站点信息