.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)让你 ...
随机推荐
- loj6171/bzoj4899 记忆的轮廊(期望dp+优化)
题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...
- 【APUE】线程与信号
每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的.进程中的信号是递送到单个线程的. 线程中pthread_sigmask函数类似与进程的sigprocmask函数,可以用来阻塞信号. ...
- 跟着9张思维导图学JavaScript
思维导图小tips 思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却又极其有效,是一种革命性的思维工具.思维导图运用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来 ...
- C++开发人脸性别识别教程(8)——搭建MFC框架之读取目录信息
在上一篇博客中我们已经绘制了MFC界面,在这篇博客中我们将加入响应代码,为MFC框架加入一个最主要的功能:打开一个目录. 一.加入相关头文件 这里头文件主要包括三类:opencv头文件.批量读取文件相 ...
- Python练习题2
如果真的想学精,学什么都不是好学的,如果真的想把Python学的出神入化,几乎自己想做什么都可以,就要下定恒心,坚持下去. 接下来继续更新Python练习题2,通过更新前一部的练习题让自己也学到了不少 ...
- OTG识别原理
如图1所示,那个是Micro USB的母头,可以清晰看到有5pin,分别是(不分顺序):Vbus.GND.D+.D-.ID.当移动设备,类似手机.平板电脑等要支持OTG功能,就必须使用这个接口,而且电 ...
- Xcode6 设置LaunchImage图标
最近设置LaunchImage图标时发现怎么都没有效果,后来发现是Xcode6中新建项目的时候会默认添加一个LaunchScreen.xib的文件,我们启动程序的时候也会发现,加载的时LaunchSc ...
- ECharts 使用
最近项目中要做图形报表,要求使用echarts实现,图形报表有很多中实现之前也接触过,但echarts还是头一次听说,正好可以趁这个机会好好学习一下它. 之前不知道就不知道啦,现在知道了就了不得了,一 ...
- Revit插件开发HelloWorld
1. 使用 VS2012 先建立一个项目. 2. 在这里我们选择建立C# 类库项目, 改动项目名称为HelloWorld. 能够自己定义改动项目存放路径. 3. 加入 Revit 插件 API 的引用 ...
- 谈谈对redux的认识
redux是从flux演变而来,但又独立于react.简言之就是,redux是一种单纯的状态管理器.可以和react搭配,也可以和其它框架搭配. redux有三个重要的部分组成: store, act ...