.Net 配置绑定 IOptions
准备
首先准备下appsettins.json以及目标类
appsettins.json
"StudentSettings": {
"Id": 1023,
"Name": "Development"
}
创建实体类
public class StudentSettings
{
public int Id { get; set; }
public string Name { get; set; }
}
绑定
//方式1
Configuration.GetSection(nameof(StudentSettings)).Bind(new StudentSettings());
//方式2
Configuration.GetSection(nameof(StudentSettings)).Get<StudentSettings>();
//方式3
services.Configure<StudentSettings>(Configuration.GetSection(nameof(StudentSettings)));
获取配置
使用IOptions接收注入的Options类,即可获取配置
public class TestController
{
private readonly IOptionsMonitor<StudentSettings> _studentSettings;
public TestController(IOptionsMonitor<StudentSettings> studentSettings)
{
_studentSettings = studentSettings;
}
[HttpGet("~/test")]
public async Task<IActionResult> Test()
{
Console.WriteLine(_studentSettings.CurrentValue.Id);
await Task.Delay(5000);
Console.WriteLine(_studentSettings.CurrentValue.Name);
return Ok();
}
}
配置操作类接口
IOptions<TOptions>
- 注册的实例为单例,可以注入到任何服务生存期;
- 不支持在应用启动后读取配置数据,既修改配置后不会自动更新到已启动的程序;
IOptionsSnapshot<IOptions>
- 注册为Scope,无法注入到单例;
- 由于注册为Scope,每次请求重新加载配置,配置修改后下个请求就能更新配置项;
IOptiionsMonitor<IOptions>
注册为单例,可以注入到任何服务生存期;
配置修改可以会重新加载配置,获取新值
Test
查看代码
private readonly IOptionsMonitor<StudentSettings> _studentSettings;
//private readonly StudentSettings _studentSettings1;
public WeatherForecastController(ILogger<WeatherForecastController> logger,
IOptionsMonitor<StudentSettings> studentSettings,
//IOptionsSnapshot<StudentSettings> studentSettings,
//IOptionsSnapshot<StudentSettings> studentSettings,
)
{
_logger = logger;
_studentSettings = studentSettings;
//_studentSettings1 = studentSettings.Val;
}
[HttpGet("~/test")]
public async Task<IActionResult> Test()
{
Console.WriteLine(_studentSettings.CurrentValue.Id);
//Console.WriteLine(_studentSettings1.Id);
await Task.Delay(5000);//留下时间修改appsetting.json配置
Console.WriteLine(_studentSettings.CurrentValue.Name);//IOptionsMonitor配置发生更改时就可以获取新值,如果在构造函数就获取Val则获取不到新值
//Console.WriteLine(_studentSettings1.Name);
return Ok();
}
在delay的时候如果使用的是IOptiionsMonitor,配置一改就会更新StudentSettings
如果使用的是IOptionsSnapshot,StudentSettings在当前请求都不会变,直到下个请求
IOptions在程序启动时是什么值就一直是什么值,直到项目重启
IOptionsMonitor源码
OptionsMonitor注册为单例却能实时更新是由于IOptionsChangeTokenSource<TOptions>,它引用了代表配置文件的对象config,所以配置文件更新会被ConfigurationChangeTokenSource监听到,IOptionsMonitor就会跟着更新;
public OptionsMonitor(IOptionsFactory<TOptions> factory, IEnumerable<IOptionsChangeTokenSource<TOptions>> sources, IOptionsMonitorCache<TOptions> cache)
{
_factory = factory;
_sources = sources;
_cache = cache;
foreach (var source in _sources)
{
var registration = ChangeToken.OnChange(
() => source.GetChangeToken(),
(name) => InvokeChanged(name),
source.Name);
_registrations.Add(registration);
}
}
//Microsoft.Extensions.Options.ConfigurationExtensions.dll
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, IConfiguration config, Action<BinderOptions> configureBinder)
where TOptions : class
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (config == null)
{
throw new ArgumentNullException(nameof(config));
}
services.AddOptions();
services.AddSingleton<IOptionsChangeTokenSource<TOptions>>(new ConfigurationChangeTokenSource<TOptions>(name, config));
return services.AddSingleton<IConfigureOptions<TOptions>>(new NamedConfigureFromConfigurationOptions<TOptions>(name, config, configureBinder));
}
.Net 配置绑定 IOptions的更多相关文章
- ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
我们在<读取配置信息>通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编写的程序.如下面的代码片段所 ...
- ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...
- iis配置绑定二级域名的问题
最近用destoon给客户做一个网站,涉及到站内企业网站的二级域名解析的问题,iis怎么配置绑定子目录绑定二级域名呢,查了好多资料,没有一个给出具体步骤的 基本是一些概念,不过看了这些东西基本理解了泛 ...
- [ASP.NET Core 3框架揭秘] 配置[4]:将配置绑定为对象
虽然应用程序可以直接利用通过IConfigurationBuilder对象创建的IConfiguration对象来提取配置数据,但是我们更倾向于将其转换成一个POCO对象,以面向对象的方式来使用配置, ...
- Spring Boot 2.0 的配置绑定类Bindable居然如此强大
1. 前言 在开发Spring Boot应用时会用到根据条件来向Spring IoC容器注入Bean.比如配置文件存在了某个配置属性才注入Bean : 图中红色的部分是说,只有ali.pay.v1.a ...
- spring boot自定义类配置绑定在配置文件中自动提示
在spring boot的日常使用中,我们可能需要使用配置绑定的方式动态配置自定义类的成员变量. 这个时候,我们在配置文件中配置spring默认已有的配置时,只需要输入部分关键字即可自动提示,如下图: ...
- ASP.NET Core 6框架揭秘实例演示[09]:配置绑定
我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定.除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置 ...
- SpringBoot2.2版本配置绑定
具体可以查看这篇:https://www.cnblogs.com/dalianpai/p/11772382.html 原始的 /** * @author WGR * @create 2019/12/ ...
- @ConfigurationProperties实现自定义配置绑定
@ConfigurationProperties使用 创建一个类,类名上方注解,配置prefix属性,如下代码: @ConfigurationProperties( prefix = "he ...
- .NET Core 读取配置技巧 - IOptions<TOptions> 接口
原文链接:https://www.cnblogs.com/ysmc/p/16307804.html 在开发过程中,我们无法离开配置文件(appsetting.json),例如配置文件中有以下内容: { ...
随机推荐
- 使用AES加密时,结果不一样
使用AES加密时,发现得到的结果不一致. python示例 from Crypto.Cipher import AES from Crypto.Util.Padding import pad from ...
- nvm安装node.js无法使用
前情 最近在使用某此第三方模块需要依赖不同的node版本,于是想通nvm来管理node版本 坑 网上下载nvm-window的安装包,一步步傻瓜式安装下去,发现nrm无法使用,设置环境变量也没有用,再 ...
- LINUX通过STTY命令操作串口设备(LINUX串口操作命令)
stty(settty,设置tty)命令用于检查和修改当前注册的终端的通信参数 1.显示某个串口参数信息:stty -F /dev/ttySTM6 -a 2.设置某个串口参数信息: ...
- PM-CentOS7也即将停止维护,将来何去何从?
停掉的CentOS包含三个版本,即:CentOS 6(2020年11月30日停止更新).CentOS7(2024年6月30日停止更新).CentOS 8(2021年底停止更新). 在当前处于生命周期中 ...
- 【Amadeus原创】域密码到期发送提醒邮件的超简单方法
1,AD服务器下载安装免费的卓豪AD管理工具 https://www.manageengine.cn/products/self-service-password/free-password-expi ...
- Avalonia 国际化之路:Resx 资源文件的深度应用与探索
在当今全球化的软件开发浪潮中,应用的国际化(i18n)与本地化(L10n)显得尤为重要.Avalonia UI 作为一款强大的跨平台 UI 框架,为开发者提供了多种实现国际化的途径.其中,使用传统的 ...
- .NET 7 中的限流
.NET 中的限流 https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/ 这里我们要宣布的是集成为 .N ...
- 【Javaweb】【Maven】【Tomcat10】jsp访问正常,Servlet访问404
Development Tool:IDEA(Intellij IDEA) Tomcat-Version:10 JDK-version:17 情况描述 我使用Tomcat10运行项目,jsp正常访问,但 ...
- alibabacloud-jindodata
https://github.com/aliyun/alibabacloud-jindodata https://github.com/aliyun/alibabacloud-jindodata/bl ...
- 如何调整Linux系统为正确时区
如果你的 Linux 系统时区配置不正确,必需要手动调整到正确的当地时区.NTP 对时间的同步处理只计算当地时间与 UTC 时间的偏移量,因此配置一个 NTP 对时间进行同步并不能解决时区不正确的问题 ...