.NET Core基础篇之:配置文件读取
配置文件是每个项目最基础的部分,也是不可或缺的部分,比如:数据库连接、中间件属性等常见的配置。
今天这篇文章主要内容就是,在.Net Core项目中怎样去读取配置文件并使用。
提前准备
appsettings.json 文件
{
"User": {
"userName": "赵一",
"userAge": 18
}
}
对应实体模型
public class UserOption
{
public string userName { get; set; }
public int userAge { get; set; }
}
常规读取
1、注册
在 startup 类中注册,主要用到的是 Configure 方法:
services.Configure<UserOption>(Configuration.GetSection("User"));
2、控制器中注入并读取
public class HomeController : ControllerBase
{
private readonly UserOption user;
public HomeController(IOptions<UserOption> userOptions)
{
user = userOptions.Value;
}
[HttpGet]
public string Get()
{
return $"姓名:{user.userName},年龄:{user.userAge} ";
}
}
输出结果:姓名:赵一,年龄:18
嵌套读取
我们对 appsettings.json 文件做一点小小的改动,增加一个子节点 child :
{
"User": {
"userName": "赵一",
"userAge": 18,
"child": {
"userName": "赵一的崽",
"userAge": 2
}
}
}
再对注册的代码做一点小小的修改:
services.Configure<UserOption>(Configuration.GetSection("User:child"));
输出结果:姓名:赵一的崽,年龄:2
分实例读取
这个时候需求又有变化了,需要同时读取 User 与 child 节点的数据,我们试试下面的方法看可行不可行:
// 注册
services.Configure<UserOption>(Configuration.GetSection("User"));
services.Configure<UserOption>(Configuration.GetSection("User:child"));
// 控制器
public class HomeController : ControllerBase
{
private readonly UserOption user;
private readonly UserOption child;
public HomeController(IOptions<UserOption> userOptions, IOptions<UserOption> childOptions)
{
user = userOptions.Value;
child = childOptions.Value;
}
[HttpGet]
public string Get()
{
return $"姓名:{user.userName},年龄:{user.userAge} \r\n姓名:{child.userName},年龄:{child.userAge}";
}
}
输出结果很显然满足不了我们的需求:
姓名:赵一的崽,年龄:2
姓名:赵一的崽,年龄:2
有的小伙伴肯定会说,在实体模型内在加一个子节点字段。这样肯定是没问题的,但是与常规读取方式就没什么两样了。
这里我要说的是分实例读取,引入 Configure 的另一个重载方法,与之前不同的是多了一个参数 name:
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, IConfiguration config) where TOptions : class;
下面我们重新注册:
services.Configure<UserOption>("father", Configuration.GetSection("User"));
services.Configure<UserOption>("son", Configuration.GetSection("User:child"));
在控制器构造函数中注入,也引入了一个新的接口对象:IOptionsMonitor
public class HomeController : ControllerBase
{
private readonly UserOption user;
private readonly UserOption child;
public HomeController(IOptionsMonitor<UserOption> userOptions, IOptionsMonitor<UserOption> childOptions)
{
user = userOptions.Get("father");
child = childOptions.Get("son");
}
[HttpGet]
public string Get()
{
return $"姓名:{user.userName},年龄:{user.userAge} \r\n姓名:{child.userName},年龄:{child.userAge}";
}
输出结果:
姓名:赵一,年龄:18
姓名:赵一的崽,年龄:2
其实还有一个接口对象能实现这样的效果:IOptionsSnapshot,那 IOptionsMonitor 与 IOptionsSnapshot 有什么不同呢?请接着往下看。
IOptionsMonitor与IOptionsSnapshot的不同之处
我们先来看看微软官方的注释:
IOptionsMonitor
//
// 摘要:
// Used for notifications when TOptions instances change.
//
// 类型参数:
// TOptions:
// The options type.
public interface IOptionsMonitor<out TOptions>
{
//
// 摘要:
// Returns the current TOptions instance with the Microsoft.Extensions.Options.Options.DefaultName.
TOptions CurrentValue { get; }
//
// 摘要:
// Returns a configured TOptions instance with the given name.
TOptions Get(string name);
//
// 摘要:
// Registers a listener to be called whenever a named TOptions changes.
//
// 参数:
// listener:
// The action to be invoked when TOptions has changed.
//
// 返回结果:
// An System.IDisposable which should be disposed to stop listening for changes.
IDisposable OnChange(Action<TOptions, string> listener);
}
IOptionsSnapshot
//
// 摘要:
// Used to access the value of TOptions for the lifetime of a request.
//
// 类型参数:
// TOptions:
// Options type.
public interface IOptionsSnapshot<out TOptions> : IOptions<TOptions> where TOptions : class, new()
{
//
// 摘要:
// Returns a configured TOptions instance with the given name.
TOptions Get(string name);
}
从字面上理解,IOptionsMonitor 建议在配置信息更改后需要通知的场景下使用,所以多了个 OnChange 的方法;而 IOptionsSnapshot 翻译过来的意思是:用于在请求的生命周期内访问配置,有点难以理解哈,我们接下来用代码来验证一下。
IOptionsMonitor 与 IOptionsSnapshot的生命周期
我们对实体模型再做一点小小的修改,增加一个 guid 字段,并给上默认值:
public class UserOption
{
public string userName { get; set; }
public int userAge { get; set; }
public Guid guid { get; set; } = Guid.NewGuid();
}
我们再次运行程序:
father — 姓名:赵一,年龄:19,编号:e0d71f47-e8f1-4a6d-875e-2074c985f4a0
son — 姓名:赵一的崽,年龄:3,编号:d865151b-f9bf-4eff-bb4e-8ab6dc61160c
然后不停的刷新页面会发现,father 的编号没有发生任何编号,而 son 的编号每次刷新都会改变。这是不是比较像我们注册时所用到的三种模式:
services.AddScoped();
services.AddTransient();
services.AddSingleton()
其中 father 类似 AddSingleton,son 则类似 AddScoped 与 AddTransient。
大家可以在同一个方法里多次调用 childOptions.Get("son") 看看 son 到底时类似 AddScoped 还是 AddTransient。
IOptionsMonitor的OnChange调用方式
userOptions.OnChange((user,name)=> { Console.WriteLine(user.userName +"-"+ name); });
无文件配置
无文件配置就是不需要以静态文件的方式进行配置。相关信息在配置一次后就不用再做修改,我们可以采用无文件配置的方式,比如我们熟悉的 AddCors 跨域配置
services.AddCors(op => {
op.AddPolicy(CorsName, set => {
set.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
});
});
我们对之前的注册方法进行一下改动:
services.Configure<UserOption>(c =>
{
c.userName = "钱二";
c.userAge = 60;
});
控制器注入采用常规的注入方式,最终输出结果:姓名:钱二,年龄:60
以上就是本篇文章的全部内容了,因为时间有限,所以讲到的内容比较少,以后时间充裕之后再做相关补充。
分享一个源码查看网站:https://source.dot.net/
.NET Core基础篇之:配置文件读取的更多相关文章
- Asp.Net Core基础篇之:白话管道中间件
在Asp.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景 ...
- ASP.Net Core 5.0 MVC 配置文件读取,Startup 类中ConfigureServices 方法、Configure 方法的使用
配置文件读取 1. 新建FirstController控制器 在appsettings文件内容替换成以下代码 { "Position": { "Title": ...
- .NET Core基础篇之:依赖注入DependencyInjection
依赖注入已经不是什么新鲜话题了,在.NET Framework时期就已经出现了各种依赖注入框架,比如:autofac.unity等.只是在.net core微软将它搬上了台面,不用再依赖第三方组件(那 ...
- .NET Core基础篇之:集成Swagger文档与自定义Swagger UI
Swagger大家都不陌生,Swagger (OpenAPI) 是一个与编程语言无关的接口规范,用于描述项目中的 REST API.它的出现主要是节约了开发人员编写接口文档的时间,可以根据项目中的注释 ...
- .NET Core基础篇之:白话管道中间件
在.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景区很远 ...
- springmvc基础篇—拆分配置文件
一般来讲,在企业实际项目中通常会将配置文件设置为两个:spring-mvc.xml.beans.xml,各自管各自的内容,方便管理. 一.在src下增加如下配置文件: <?xml version ...
- 【Spark机器学习速成宝典】基础篇03数据读取与保存(Python版)
目录 保存为文本文件:saveAsTextFile 保存为json:saveAsTextFile 保存为SequenceFile:saveAsSequenceFile 读取hive 保存为文本文件:s ...
- .net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇
.net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以. ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
随机推荐
- 阿里云 Serverless 再升级,从体验上拉开差距
差距都在细节上. Serverless 要成就云计算的下一个 10 年,不仅需要在技术上持续精进,也需要在产品体验上精耕细作. 近日,阿里云 Serverless 再度升级,发布了一系列围绕产品体验方 ...
- 【NOIP1998】 三连击 题解
文章转载前需和原作者联系,否则追究法律责任 题目链接:https://www.luogu.com.cn/problem/P1008 首先我们来分析一下题目.要求是枚举三个数,比例为1:2:3,且各个数 ...
- 洛谷4755 Beautiful Pair (分治)
题目描述 小D有个数列 \(a\),当一个数对 \((i,j)(i\le j)\) 满足\(a_i\)和\(a_j\)的积 不大于 \(a_i \cdots a_j\) 中的最大值时,小D认为这个数对 ...
- bzoj4552排序(线段树,二分)
题目大意 给定一个长度为n的序列,有m个操作,操作包括两种: \(0\ l\ r\)区间[l,r]的数字升序排序 \(1\ l\ r\)区间[l,r]的数字降序排序 最后询问在q位置上的数是多少? 其 ...
- 01_vue实例_数据_方法
创建实例 var vm = new Vue( { //选项 } ) 数据对象 // 我们的数据对象 var data = { a: 1 } // 该对象被加入到一个 Vue 实例中 var vm = ...
- Java(27)集合二List
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228435.html 博客主页:https://www.cnblogs.com/testero ...
- TCP 粘包 - 拆包问题及解决方案
目录 TCP粘包拆包问题 什么是粘包 - 拆包问题 为什么存在粘包 - 拆包问题 粘包 - 拆包 演示 粘包 - 拆包 解决方案 方式一: 固定缓冲区大小 方式二: 封装请求协议 方式三: 特殊字符结 ...
- Convolutional Neural Network-week2编程题1(Keras tutorial - 笑脸识别)
本次我们将: 学习到一个高级的神经网络的框架,能够运行在包括TensorFlow和CNTK的几个较低级别的框架之上的框架. 看看如何在几个小时内建立一个深入的学习算法. 为什么我们要使用Keras框架 ...
- Java版流媒体编解码和图像处理(JavaCPP+FFmpeg)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- X264编码测试验证
之前在做一个rtsp直播需求,其中一个方案是要用的x264来对摄像头数据进行实时编码推流,摄像头帧率是25fps,为了验证方案的可行性,先对x264的编码速度进行一个测试研究,再确认是否要采用此方案. ...