准备

  首先准备下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. Spring Cloud Alibaba:一站式微服务解决方案

    一.简介 Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理.配置管理.服务发现.消息总线等问题而设计. ...

  2. Qt tr 无法翻译

    项目中碰到部分tr无法翻译的问题,最后发现由于继承QObject的子类没有加上Q_OBJECT宏.

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

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

  4. C#调用Python脚本的方式(一),以PaddleOCR-GUI为例

    前言 每种语言都有每种语言的优势,Python由于其强大的生态,很多任务通过调用包就可以实现,那么学会从C#项目中调用Python脚本完成任务就很重要.C#调用Python代码有多种方式,如果Pyth ...

  5. 【COS 加码福利】COS 用户实践有奖征文,等你来投稿!

    COS用户实践征文活动火热进行中,本次征集主题为:如何在生态场景下使用 COS? 优质文章将有机会被编入腾讯云官方文档库,供广大用户学习参考.更有多重好礼等你来拿,速来围观投稿吧! 投稿说明: 1.投 ...

  6. 工作中这样用MQ,很香!

    前言 消息队列(MQ)是分布式系统中不可或缺的技术之一. 对很多小伙伴来说,刚接触MQ时,可能觉得它只是个"传话工具",但用着用着,你会发现它简直是系统的"润滑剂&quo ...

  7. 非root用户使用AntDeploy部署docker

    AntDeploy这个东西非常好用,可以直接将.NET CORE的程序直接发布到docker,刚好我有这个需求,但是程序默认给的账户示例是root账户的,需要对于需要分散开发的同学来说,这个东西风险有 ...

  8. Vscode实现应用qss样式表

    qss简介 qss(Qt Style Sheets)是一种基于CSS的样式语言,用于描述用户界面元素的外观和感觉.qss可以让用户在不修改代码的情况下,轻松地自定义应用程序的外观. 其语法基本如下: ...

  9. 比特币源码分析--深入理解区块链16.Base58编码和解码

    比特币源码分析--深入理解区块链16.Base58编码和解码   Base58是比特币中使用的一种独特编码方式,它主要用于比特币的钱包地址,在前面文章已经介绍过如何通过椭圆曲线方程算法,通过私钥来生成 ...

  10. 在openEuler RISC-V上无痛部署Solidity

    近几年区块链很火,随着各国政府对加密技术的监管政策不断变化和BTC的暴涨,越来越多人对这项去中心化的技术充满着期待.这次我用openEuler 24.09 RISC-V的远程机器尝试编译了Solidi ...