.net core系列之《新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践》
在我们之前.Net Framework的项目中,配置文件是WebConfig或AppcConfig文件,而当我们想要添加我们自定义的节点时,还需要在这个文件中的section中定义我们自定义的节点,这样的配置文件中的系统配置和我们自定义的配置耦合度也很高。
而在.Net Core中,配置系统改变了,它支持多种数据源,让配置文件变的不再单一化:json,xml,ini,memory,command, env
以下项目都是以控制台项目为基础
一、Json
1、要想加载json文件中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.Json
2、我们在项目中新增一个 appSettings.json 文件,并且设置始终复制到输出目录
3、接下来我们看以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration["username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后我们可以看到控制台上输入json文件中的结果
二、Xml
1、要想加载xml文件中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.Xml
2、我们在项目中新增一个 appSettings.xml 文件,并且设置始终复制到输出目录
3、接下来我们看以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddXmlFile("appSettings.xml")
.Build();
var info = configuration["username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后我们可以看到控制台上输入xml文件中的结果
三、Ini
1、要想加载ini文件中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.Ini
2、我们在项目中新增一个 appSettings.ini文件,并且设置始终复制到输出目录
3、接下来我们看以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddIniFile("appSettings.ini")
.Build();
var info = configuration["[user] username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后我们可以看到控制台上输入ini文件中的结果
四、Memory
1、要想加载MemoryCollection中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration 由于以上数据源安装的时候的包都依赖于它,所有这里不需要安装
2、接下来看代码:
static void Main(string[] args)
{
List<KeyValuePair<string, string>> initialData = new List<KeyValuePair<string, string>>();
initialData.Add(new KeyValuePair<string, string>("username", "tom")); IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddInMemoryCollection(initialData)
.Build();
var info = configuration["username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后得出结果tom
五、CommandLine
目录还没用过,待研究
六、EnviromentVariables
这个是从环境变量中获取值
1、我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.EnvironmentVariables
2、打开你的电脑,右键属性,选择高级,选择环境变量,随便复制一个环境变量名
3、然后将你复制的变量名作为你要获取该环境变量值的Key
4、以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddEnvironmentVariables()
.Build();
var info = configuration["ASPNETCORE_ENVIRONMENT"];
Console.WriteLine(info);
Console.ReadKey();
}
以AddJsonFile这个方法为例,我们可以看出,这个方法有多个重载:
public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path);
public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional); public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional, bool reloadOnChange);
optional这个参数表示这个文件是否是可选的,reloadOnChange这个表示文件改变时,是否重新加载这个文件(热加载)
reloadOnChange=true时,项目在运行,获取到username这个值为tom,当我们从json文件中改变username的值为lucy时,项目读取它的值也会立马发生改变 七、弱类型读取 以上获取json文件中的数据都是一维的,那么二维,三维,多维的时候我们该怎么获取呢?
接下来我们调试下,看看最终得到的IConfiguration里面是什么样子的,我在json文件中写了一个person数组
1、用:运算符的方式获取想要的数据
我们可以看出,数据是Key,Value类型的,是不是只要我们根据前面的key就可以获取后面的 Value呢?
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration["person:0:name"];
Console.WriteLine(info);
Console.ReadKey();
}
结果:
2、使用GetSection ()方法进行获取
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration.GetSection("person").GetSection("").GetSection("name").Value;
var info1 = configuration.GetSection("person").GetSection("")["name"];
Console.WriteLine(info);
Console.WriteLine(info1);
Console.ReadKey();
}
结果如下:
八、强类型读取
安装 Microsoft.Extensions.Configuration.Binder 包
1、GetValue<T>
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration.GetValue<string>("username");
Console.WriteLine(info);
Console.ReadKey();
}
}
结果如下:
2、Bind()
public class Rootobject
{
public string username { get; set; }
public Person[] person { get; set; }
}
public class Person
{
public string id { get; set; }
public string name { get; set; }
}
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
Rootobject rootobject = new Rootobject();
configuration.Bind(rootobject);
Console.WriteLine(rootobject.username);
Console.ReadKey();
}
结果如下:
3、Get<T>()
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
Rootobject rootobject=configuration.Get<Rootobject>();
Console.WriteLine(rootobject.username);
Console.ReadKey();
}
结果如下:
那么Bind()和Get<T>()有什么区别呢?
通过源码分析这两个方法,主要区别在于,Get<T>()方法主要用到了反射,通过反射创建T的一个对象返回
.net core系列之《新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践》的更多相关文章
- .net core系列之《.net core内置IOC容器ServiceCollection》
一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...
- Asp.Net Core 内置IOC容器的理解
Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- NET Core 3.0 AutoFac替换内置DI的新姿势
原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...
- 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】
原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...
- 简单讲解Asp.Net Core自带IOC容器ServiceCollection
一. 理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二. 接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...
- asp.net core 内置DI容器的一点小理解
DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...
- 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)
1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform vari ...
- .net core 2.0学习记录(三):内置IOC与DI的使用
本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...
随机推荐
- flot中文详解
调用plot函数的方法如下: var plot = $.plot(placeholder, data, options) Data的结构: data应该是data series的一个数组: [ ser ...
- Linux下mysql基础命令(一)
1, 创建mysqld数据库的管理用户: 要把root用户设置为管理员,我们应该运行下面的命令: # mysqladmin -u root password 密码 一般情 ...
- Http的Get和Post--扫盲篇
Http Get请求,根据Http规范Get用于服务器信息的获取,而且安全及幂等的.其中安全的在此处的含义是:不会对服务器数据造成修改.增加.以及数据状态的改变. Http Post请求,表示可能修改 ...
- 深入理解java集合框架之---------HashMap集合
深入理解HaspMap死循环问题 由于在公司项目中偶尔会遇到HashMap死循环造成CPU100%,重启后问题消失,隔一段时间又会反复出现.今天在这里来仔细剖析下多线程情况下HashMap所带来的问题 ...
- vue中过滤器比较两个数组取相同值
在vue中需要比较两个数组取相同值 一个大数组一个 小数组,小数组是大数组的一部分取相同ID的不同name值 有两种写法,两个for循环和map写法 const toName = (ids, arr) ...
- vue监听不到props中的值时
已解决: watch: { data: { immediate: true, handler: function(newVal) { console.log(newVal); } } },
- iOS开源项目周报0323
由OpenDigg 出品的iOS开源项目周报第十三期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. CHIPag ...
- [转]a-mongodb-tutorial-using-c-and-asp-net-mvc
本文转自:http://www.joe-stevens.com/2011/10/02/a-mongodb-tutorial-using-c-and-asp-net-mvc/ In this post ...
- 撩课-Web架构师养成系列(第二篇)-async
前言 Web架构师养成系列共15篇,每周更新一篇,主要分享.探讨目前大前端领域(前端.后端.移动端)企业中正在用的各种成熟的.新的技术.部分文章也会分析一些框架的底层实现,让我们做到知其然知其所以然. ...
- golang产生guid
labix.org/v2/mgo/bson 包虽然是MongoDB的golang实现,其中产生唯一ID的算法是独立的,不依赖MongoDB, 提炼这部分的代码如下: package main im ...