代码改变世界

net Core TOptions和热更新

  糯米粥  阅读(1117)  评论(1编辑  收藏  举报

TOptions接口

net Core 项目有个appsettings.json文件,程序默认也是读取的这个文件,appsettings.json是一个配置文件

我们可以把appsettings.json里面的json字符串映射成实体对象,打开appsettings.json文件,添加如下结构

Info是我新增的,Logging是默认生成的。暂时不管

新增实体类,不区分大小写

ConfigureServices注册

 

Configuration.GetSection("Info")  是获取appsettings.json文件中的某个节点,跟Info绑定

注册以后,在其他地方就可以通过DI注入使用了,比如:通过构造注入就能获取到数据了

IOptions 依赖命名空间: Microsoft.Extensions.Options; 

 

如果你想在 ConfigureServices 中就使用对象Info呢?那么可以通过Bind方法

Bind方法有两个重载

 

所以可以这样绑定

 

 

上面说了。我们只是获取了appsettings.json中的某个节点,如果想把appsettings.json所有数据

都绑定到Configuration呢?还有一种是这样的结构

用上面的代码就行不通了,要换一种写法:

查看结果发现:info2是没有值的,这样又多了一个Get方法,

 

热更新IOptionsSnapshot接口

 

我们知道传统的net,如果修改了Web.Config网站是需要重启的,在net core是支持热更新的

 IOptionsSnapshot 接口,也依赖于命名空间: using Microsoft.Extensions.Options 

为了测试,我们在修改下构造函数

这样便于对比

ConfigureServices里面不变,加个断点,然后运行项目,目前他们是一样结果

 

然后我修改下appsettings.json某个字段的值

在次刷新项目,info2的值变了。IDE还用红色突出了这个值变化了

 

至于IOptions和IOptionsSnapshot有什么区别,我找了只是指出了一个支持热更新,一个不支持

具体内部的代码实现,有兴趣的小伙伴可以去github看源码

 

刚说了,net core 默认是加载appsettings.json文件,有个参数是可以指定:是否支持热更新

 reloadOnChange 参数:如果文件更改,是否应重新加载配置。

当然,这仅仅对支持热更新的IOptionsSnapshot有效

我们也可以手动指定加载这个appsettings.json,当然,如果你手动加载的话,名字可以随便取,不一定叫appsettings.json

当然,约定大于配置,用这个名,一看就知道是配置文件

如果自定义,也就是用ConfigureAppConfiguration注册使用AddJsonFile方法,如果不添加 reloadOnChange 

那么默认是false,那么IOptionsSnapshot就不会支持热更新了,具体对比结果我就不截图了

https://www.jianshu.com/p/b9416867e6e6

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
'
点击右上角即可分享
微信分享提示