.Net Core之Configuration
ASP.NET CORE 中自动集成了应用配置,支持从以下 源 处获取配置键值对
- 命令行
- 环境变量
- 内存
- 文件配置
其中文件配置是我们最常用的方式,默认文件是.json的json格式文件,摒弃了以往.config的xml的文件格式。
应用配置有以下几个约定:
- 键不区分大小写,如果存在相同的键,则取最后一个值
- 分层键 : 取子节点。或者__双下划线
- 值默认为字符串
- 不存储NULL值
那么
问:配置文件是如何加载的呢?
答:默认加载appsettings.json,如果有自定义的文件需要加载,则需要在WEBHOST初始化时添加文件路径。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
//config.SetBasePath(Directory.GetCurrentDirectory());//如果iis调试,请注释
config.AddJsonFile("appsettings_ext.json", optional: false, reloadOnChange: false);
})
.UseStartup<Startup>();
问:如果获取配置文件内容
答:IConfiguration。支持在任何地方注入。并有以下几个主要获取Value的方法
配置文件示例:
"one": "1",
"two": { "_two": "2" },
"fourToSeven": [ "4", "5", "6", "7" ],
"People": {
"Name": "gt",
"Male": "1"
},
"Books": [
{ "Name": "语文" },
{ "Name": "数学" }
]
取值方式
//直接获取键值对的Value
_configuration.GetValue<string>("one"); //获取子节点的Value,使用约定:
_configuration.GetValue<string>("two:_two");
//或者获取section的子节点,再去获取Value
_configuration.GetSection("two").GetChildren().First(x => string.Equals("_two", x.Key, StringComparison.CurrentCultureIgnoreCase)); //获取数组的方式,本质是一个
_configuration.GetSection("fourToSeven").Get<string[]>();
问:实际应用中我们通常使用类对象来表示配置,.NET CORE里面是如何绑定到类的
答:.NET CORE提供了Bind方法来将配置绑定到类,另外还提供了Options方式来实现
//获取Section绑定到对象类,注意对象类的属性值要和配置中一致
var user = new People();
_configuration.GetSection("People").Bind(user);
_people = user; //也可以采用万能的Get方式,更为简洁
_configuration.GetSection("people").Get<People>(); public class People
{
public string Name { get; set; }
public int Male { get; set; }
}
Options方式应该是我们日常应用中常用的方式,毕竟IConfiguration需要在使用的地方注入,且需要知道KEY,这就形成了硬编码模式。
我们先定义一个Options,
public class BookOptions
{
public string Name { get; set; }
}
那么我们可以在Startup类的ConfigureServices中进行 配置。
services.Configure<List<BookOptions>>(Configuration.GetSection("books"));
//这种方式可以给配置项目一个名称,获取的时候根据名称获取
services.Configure<List<BookOptions>>("myname",Configuration.GetSection("books"));
使用Options也是通过注入的方式使用(万恶的.NET CORE,无处不在注入)。.NET CORE使用 IOptionsMonitor<T>注入的方式,同时其也控制着Options生命周期 。
private readonly List<BookOptions> _books;
private readonly List<BookOptions> _booksNamed; public ConfigController(IConfiguration configuration,
IOptionsMonitor<List<BookOptions>> bookAccessor,
IOptionsSnapshot<List<BookOptions>> bookNamedAccessor)
{
_configuration = configuration;
_books = bookAccessor.CurrentValue;
_booksNamed = bookNamedAccessor.Value;
}
IOptionsSnapshot<TOptions> 支持包含最小处理开销的重新加载选项。针对请求生存期访问和缓存选项时,每个请求只能计算一次选项。
.NET CORE配置使用大抵如此,当然实际应用中可能会更复杂点,其也提供了很多扩展方法。
.Net Core之Configuration的更多相关文章
- .NET Core 配置Configuration杂谈
前言 .NET Core 在配置文件的操作上相对于.NET Framework做了不少改变,今天来聊一聊.关于Configuration的Package都是以Microsoft.Extensions. ...
- 理解ASP.NET Core - 配置(Configuration)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 配置提供程序 在.NET中,配置是通过多种配置提供程序来提供的,包括以下几种: 文件配置提供程 ...
- .Net Core配置Configuration源码研究
最近又研究了一下.NetCore配置选项的源码实现,又学习到了不少东西.这篇文章先写一下IConfiguration的学习成果,Options的后面补上 核心类 ConfigurationBuilde ...
- Configuration in ASP.NET Core(未完,待续)
Configuration in ASP.NET Core App configuration in ASP.NET Core is based on key-value pairs establis ...
- .NET Core 3.0之创建基于Consul的Configuration扩展组件
写在前面 经过前面三篇关于.NET Core Configuration的文章之后,本篇文章主要讨论如何扩展一个Configuration组件出来.如果前面三篇文章没有看到,可以点击如下地址访问 .N ...
- asp.net core 系列之Configuration
在ASP.NET Core中的App configuration 是通过configuration providers基于key-value对建立的.Configuration providers读取 ...
- 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...
- ASP.NET Core 中文文档 第三章 原理(14)服务器
原文:Servers 作者:Steve Smith 翻译:谢炀(Kiler) 校对:许登洋(Seay).姚阿勇(Dr.Yao) ASP.NET Core 已完全从承载应用程序的 Web 服务器环境中分 ...
- ASP.NET Core模块概述
原文地址:ASP.NET Core Module overview By Tom Dykstra, Rick Strahl, and Chris Ross ASP.NET Core模块(ANCM)让你 ...
随机推荐
- File类 判断功能和获取功能
package cn.zmh.File; import java.io.File; /* * * File判断功能 * * */ public class FileDemo3判断功能 { public ...
- Unity从实践中学习(1)
首先在实际中unity的开发之中快捷键应该是相当重要的一个部分,这里先引用csdn的一个博客,https://blog.csdn.net/qq_34552886/article/details/697 ...
- Org-mode五分钟教程ZZZ
Table of Contents 1 源起 2 简介 2.1 获取 org-mode 2.2 安装 3 基础用法 3.1 创建一个新文件 3.2 简单的任务列表 3.3 使用标题组织一篇文章 3.4 ...
- chrome插件vimium的安装和使用
vimium工具的作用:使你脱离鼠标,使用键盘方便操作页面,默认对所有网站生效 1.chrome商店里有的,但是,我怎么安装,都不行 2.源码安装:http://vimium.github.io/ h ...
- 基于51单片机的CAN通讯协议C语言程序
//-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...
- [Javascript] Use JavaScript's for-in Loop on Objects with Prototypes
Loops can behave differently when objects have chained prototype objects. Let's see the difference w ...
- Dom对象的经常用法
Dom对象的经常用法: (1)getElementById() 查询给定ID属性值的元素,返回该元素的元素节点 1. 查询给定ID属性值的元素,返回该元素的元素节点.也称为元素对象. ...
- leetCode 78.Subsets (子集) 解题思路和方法
Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...
- js性能优化之函数节流(分流函数)
函数节流的原理 比如我们在window.onresize事件中要打印当前浏览器窗口的大小,在我们通过拖拽来改变窗口大小时候,打印窗口大小这个工作1s就运行了10次.而实际上我们只需要2次或者3次. 比 ...
- HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)
HTTP协议漫谈 简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...