准备

  首先准备下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的更多相关文章

  1. ASP.NET Core的配置(3): 将配置绑定为对象[下篇]

    我们在<读取配置信息>通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编写的程序.如下面的代码片段所 ...

  2. ASP.NET Core的配置(3): 将配置绑定为对象[上篇]

    出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...

  3. iis配置绑定二级域名的问题

    最近用destoon给客户做一个网站,涉及到站内企业网站的二级域名解析的问题,iis怎么配置绑定子目录绑定二级域名呢,查了好多资料,没有一个给出具体步骤的 基本是一些概念,不过看了这些东西基本理解了泛 ...

  4. [ASP.NET Core 3框架揭秘] 配置[4]:将配置绑定为对象

    虽然应用程序可以直接利用通过IConfigurationBuilder对象创建的IConfiguration对象来提取配置数据,但是我们更倾向于将其转换成一个POCO对象,以面向对象的方式来使用配置, ...

  5. Spring Boot 2.0 的配置绑定类Bindable居然如此强大

    1. 前言 在开发Spring Boot应用时会用到根据条件来向Spring IoC容器注入Bean.比如配置文件存在了某个配置属性才注入Bean : 图中红色的部分是说,只有ali.pay.v1.a ...

  6. spring boot自定义类配置绑定在配置文件中自动提示

    在spring boot的日常使用中,我们可能需要使用配置绑定的方式动态配置自定义类的成员变量. 这个时候,我们在配置文件中配置spring默认已有的配置时,只需要输入部分关键字即可自动提示,如下图: ...

  7. ASP.NET Core 6框架揭秘实例演示[09]:配置绑定

    我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定.除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置 ...

  8. SpringBoot2.2版本配置绑定

    具体可以查看这篇:https://www.cnblogs.com/dalianpai/p/11772382.html  原始的 /** * @author WGR * @create 2019/12/ ...

  9. @ConfigurationProperties实现自定义配置绑定

    @ConfigurationProperties使用 创建一个类,类名上方注解,配置prefix属性,如下代码: @ConfigurationProperties( prefix = "he ...

  10. .NET Core 读取配置技巧 - IOptions<TOptions> 接口

    原文链接:https://www.cnblogs.com/ysmc/p/16307804.html 在开发过程中,我们无法离开配置文件(appsetting.json),例如配置文件中有以下内容: { ...

随机推荐

  1. 使用AES加密时,结果不一样

    使用AES加密时,发现得到的结果不一致. python示例 from Crypto.Cipher import AES from Crypto.Util.Padding import pad from ...

  2. nvm安装node.js无法使用

    前情 最近在使用某此第三方模块需要依赖不同的node版本,于是想通nvm来管理node版本 坑 网上下载nvm-window的安装包,一步步傻瓜式安装下去,发现nrm无法使用,设置环境变量也没有用,再 ...

  3. LINUX通过STTY命令操作串口设备(LINUX串口操作命令)

    stty(settty,设置tty)命令用于检查和修改当前注册的终端的通信参数 1.显示某个串口参数信息:stty -F /dev/ttySTM6  -a          2.设置某个串口参数信息: ...

  4. PM-CentOS7也即将停止维护,将来何去何从?

    停掉的CentOS包含三个版本,即:CentOS 6(2020年11月30日停止更新).CentOS7(2024年6月30日停止更新).CentOS 8(2021年底停止更新). 在当前处于生命周期中 ...

  5. 【Amadeus原创】域密码到期发送提醒邮件的超简单方法

    1,AD服务器下载安装免费的卓豪AD管理工具 https://www.manageengine.cn/products/self-service-password/free-password-expi ...

  6. Avalonia 国际化之路:Resx 资源文件的深度应用与探索

    在当今全球化的软件开发浪潮中,应用的国际化(i18n)与本地化(L10n)显得尤为重要.Avalonia UI 作为一款强大的跨平台 UI 框架,为开发者提供了多种实现国际化的途径.其中,使用传统的 ...

  7. .NET 7 中的限流

    .NET 中的限流 https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/ 这里我们要宣布的是集成为 .N ...

  8. 【Javaweb】【Maven】【Tomcat10】jsp访问正常,Servlet访问404

    Development Tool:IDEA(Intellij IDEA) Tomcat-Version:10 JDK-version:17 情况描述 我使用Tomcat10运行项目,jsp正常访问,但 ...

  9. alibabacloud-jindodata

    https://github.com/aliyun/alibabacloud-jindodata https://github.com/aliyun/alibabacloud-jindodata/bl ...

  10. 如何调整Linux系统为正确时区

    如果你的 Linux 系统时区配置不正确,必需要手动调整到正确的当地时区.NTP 对时间的同步处理只计算当地时间与 UTC 时间的偏移量,因此配置一个 NTP 对时间进行同步并不能解决时区不正确的问题 ...