.Net Core配置文件
.Net Core下如何管理配置文件
一、前言
根据该issues来看,System.Configuration在.net core中已经不存在了,那么取而代之的是由Microsoft.Extensions.Cnfiguration.XXX一系列的类库提供,对应的开源地址为点击这里。
从当前开源的代码来看,在.net core下提供了以下类库给我们:
Microsoft.Extensions.Configuration.Abstractions:基础接口
Microsoft.Extensions.Configuration:实现上面的基础接口
Microsoft.Extensions.Configuration.FileProviderExtensions:提供重载配置扩展
Microsoft.Extensions.Configuration.Binder:提供转换到实体功能
Microsoft.Extensions.Configuration.FileExtensions:提供配置文件根路径扩展
以下为提供对哪些方式的支持:
Microsoft.Extensions.Configuration.CommandLine:命令行参数
Microsoft.Extensions.Configuration.EnvironmentVariables:环境变量
Microsoft.Extensions.Configuration.Ini:Ini格式
Microsoft.Extensions.Configuration.Json:Json格式
Microsoft.Extensions.Configuration.Xml:Xml格式
由上面类库的数量我们可以看出今后我们不会在需要加载更多的库,只要按需加载就可以了,那么我们也可以看到新的Configuration提供了更多格式的支持,当然我们自己也可以自行扩展以提供对更多格式的支持。下面我们开始进入正文,从头到尾的学习这5种支持的配置格式。
注意:需要VS2015开发工具
二、正文
首先我们需要创建一个名为“CoreClrConfiguration”的空解决方案,下面将会在这一个解决方案中将下面几节的内容进行演示。如果读者只对其中某一个部分感兴趣可以直接翻阅到对应的内容下,每个小节都是相互独立的没有对应关系。
应该新建哪种项目模板如下图所示:

A. CommandLine(命令行参数)
在新建项目(名为“CommandLineCfg”)中的project.json中增加以下的依赖(具体版本请读者根据实际情况决定):
"Microsoft.Extensions.Configuration.CommandLine": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"
需要注意的是该依赖库为全局依赖库,非dnx451或dnxcore50下的依赖库。
注:在project.json指定完依赖库之后需要右击“引用”->“还原程序包”,之后的部分将不再阐述。
首先我们先举一个简单的例子,读取一个参数的值。首先打开Program.cs文件在其中写入以下的程序:

1 public static void Main(string[] args)
2 {
3 var cmdLineConfig = new CommandLineConfigurationProvider(args);
4 cmdLineConfig.Load();
5
6 string value1 = null;
7 cmdLineConfig.TryGet("key1", out value1);
8
9 Console.WriteLine($"key1={value1}");
10
11 Console.ReadKey();
12 }

这里我们可以看到“CommandLineConfigurationProvider”的命名,后面我们介绍的能够提供对其他格式的支持都会以“xxxConfigurationProvider”来命名的,并且基类都是“ConfigurationProvider”。简单的介绍完之后下面我们需要开始运行该程序,我们先打开该项目的属性,输入一些测试用的命令行参数:

当然我们这里只是使用了其中一种支持的格式,其他支持的格式如下:
-Key1=Value1
--Key1=Value1
/Key1=Value1
--Key1 Value1
如果读者,在应用程序参数中的后面重复写了“/Key1 Value2”那么程序中只会采用最后一个设置的值且不区分大小写。
注:如果命令行参数只传递了key而没有传递value那么在load的时候就会抛出FormatException异常。
类似于我们常用的ORM一样,对于外部命令行传入的参数,key我们其实是可以自己做投影,将对应的key改为我们所希望的key。比如上面的“key1”我们就可以在改为“key2”。而要做到这一效果只需要在创建CommandLineConfigurationProvider的时候利用第二个参数将我们即可,比如下面我们将会将“key1”改为”key2”:

public static void Main(string[] args)
{
Dictionary<string, string> defaults = new Dictionary<string, string>
{
{ "--Key1","key2" }
}; var cmdLineConfig = new CommandLineConfigurationProvider(args, defaults);
cmdLineConfig.Load(); string value1 = null;
cmdLineConfig.TryGet("key2", out value1);
Console.WriteLine($"key1&key2={value1}"); Console.ReadKey();
}

其中我们可以看到defaults字典中的key必须加上“--”或“-”否则在调用构造函数时将会抛出ArgumentException异常。最终我们可以看到获取值的时候是利用后来我们投影之后的key的名称去获取而不是“key1”了。
除了通过上面这种方式获取值之外,还提供了一个通用的模型绑定,能够将其他的格式转换为POCO,这样能够便于我们更快速的开发,下面笔者将通过两种方式来讲述,首先是利用我们当前已经创建好的Provider来进行Bind,其中POCO如下:
public class CommandLineArgs
{
public string Key1 { get; set; }
}
Main方法的实现如下:

var cmdLineConfig = new CommandLineConfigurationProvider(args);
var builder = new ConfigurationBuilder();
builder.Add(cmdLineConfig);
var item = builder.Build().Get<CommandLineArgs>(); Console.WriteLine($"key1&key2={item.Key1}");

其中ConfigurationBuilder可以管理多个Provider,比如我们开发一个系统可以将命令行、Json文件、Ini文件和XML文件都添加到其中进行管理。如果我们调用了Builder方法,那么我们就可以利用其返回值统一的获取我们想要的值,内部会从这些Provider中尝试获取我们需要的值如果有值则立即返回,而模型绑定是通过对其扩展加进去的。具体扩展了以下的方法:

public static class ConfigurationBinder
{
public static void Bind(this IConfiguration configuration, object instance);
public static object Get(this IConfiguration configuration, Type type);
public static object Get(this IConfiguration configuration, Type type, string key);
public static T Get<T>(this IConfiguration configuration);
public static T Get<T>(this IConfiguration configuration, T defaultValue);
public static T Get<T>(this IConfiguration configuration, string key);
public static T Get<T>(this IConfiguration configuration, string key, T defaultValue);
}

其实现在Microsoft.Extensions.Configuration.Binder中。
另一种方式则是不通过创建CommandLineConfigurationProvider直接利用ConfigurationBuilder实现相同的效果:
var builder = new ConfigurationBuilder();
builder.AddCommandLine(args);
var item = builder.Build().Get<CommandLineArgs>();
Console.WriteLine($"key1={item.Key1}");
其中AddCommandLine也是扩展方法,并且下面的四种中都有对应的扩展,内部的实现其实就是创建了Provider,比如这个方法的内部实现如下:

1 public static IConfigurationBuilder AddCommandLine(this IConfigurationBuilder configurationBuilder, string[] args)
2 {
3 configurationBuilder.Add(new CommandLineConfigurationProvider(args));
4 return configurationBuilder;
5 }

到这里关于命令行参数告一段落,如果读者想了解更多的信息,可以查看对应的源码以及单元测试。
B. EnvironmentVariables(环境变量)
在新建项目(名为“EnvironmentVariablesCfg”)中的Project.json中增加以下的依赖:
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是该依赖库为全局依赖库,非dnx451或dnxcore50下的依赖库。
跟之前的格式一样,我们这里先通过一个简单的例子来讲述如何使用。相信很多新建过.NET Core项目的人都曾看到属性窗口中的“环境变量”,但是却不知道如何使用,而本节我们将会利用它读取对应的配置信息。首先我们在其中新建一个值:

然后我们打开Program.cs写入以下的程序:

public static void Main(string[] args)
{
var provider = new EnvironmentVariablesConfigurationProvider();
provider.Load(); string value = null;
provider.TryGet("con", out value);
Console.WriteLine($"con={value}"); Console.ReadKey();
}

我们可以看到跟上一节的方式是一模一样的,这样对于我们今后自己进行扩展来说,就避免的我们系统内部的修改。
如果读者细心查看provider中的Data会发现其中不仅仅保存我们的配置信息还保存了大量的系统配置信息,这是因为在调用Load的时候内部还将系统配置信息也读取了,对应的源码如下:
public override void Load()
{
Load(Environment.GetEnvironmentVariables());
}
在我们初始化provider时可以看到构造函数还支持prefix,那么下面我们利用prefix来定义一个拥有自己前缀的配置避免跟其他的配置信息相互冲突:

var provider = new EnvironmentVariablesConfigurationProvider("cfg:");
provider.Load();
string value = null;
provider.TryGet("con", out value);
Console.WriteLine($"con={value}");
Console.ReadKey();

读者还要记得到项目的属性中将环境配置中的变量的key改成cfg:Con,否则value获取出来的就是null了。
相信聪明的读者已经知道对应的如何使用了,所以笔者在这里只列出对应的代码(两种方式)。
public class EnvirVarCfg
{
public string Con { get; set; }
}
方式1:
var provider = new EnvironmentVariablesConfigurationProvider("cfg:");
var builder = new ConfigurationBuilder();
builder.Add(provider);
var item = builder.Build().Get<EnvirVarCfg>();
Console.WriteLine($"con={item.Con}");
方式2:
var builder = new ConfigurationBuilder();
builder.AddEnvironmentVariables("cfg:");
var item = builder.Build().Get<EnvirVarCfg>();
Console.WriteLine($"con={item.Con}");
至此环境变量这节就结束了,如果已经掌握规律的读者下面三节应该很快就能够掌握了。
C. Ini
在新建的项目(名为“IniCfg”)中的Project.json中增加以下的依赖:
"Microsoft.Extensions.Configuration.Ini": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是该依赖库为全局依赖库,非dnx451或dnxcore50下的依赖库。
首先我们在项目根目录下新建一个“config.ini”文件,并在其中写入如下的内容以便我们读取:

[SegOne]
Con=localhost [SegTwo]
Con=192.168.1.113
Ext:Port=5535 [Seg:Three]
Con=192.169.12.12

然后我们打开Program.cs文件写入如下代码去读取配置文件中的内容:
相同很多人都看见过类似的配置文件,特别是在搭建一些服务的时候,那么从.net core开始也将原生支持这些配置,当然上面的示例中没有给出对应的注释,对应的注释要以“;”、“#”和“/”开头即可。
因为在该结构下会存在复杂类型包含复杂类型的情况,所以下面我们的模型可能比较复杂:
第一种实现方式:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini");
var provider = new IniConfigurationProvider(path);
var builder = new ConfigurationBuilder();
builder.Add(provider);
var item = builder.Build().Get<IniModelCfg>(); Console.WriteLine($"SegOne-Con={item.SegOne.Con}");
Console.WriteLine($"SegTwo-Con={item.SegTwo.Con}");
Console.WriteLine($"SegTwo-Ext:Port={item.SegTwo.Ext.Port}");
Console.WriteLine($"Seg:Three-Con={item.Seg.Three.Con}");

第二种实现方式:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini");
var builder = new ConfigurationBuilder();
builder.AddIniFile(path);
var item = builder.Build().Get<IniModelCfg>(); Console.WriteLine($"SegOne-Con={item.SegOne.Con}");
Console.WriteLine($"SegTwo-Con={item.SegTwo.Con}");
Console.WriteLine($"SegTwo-Ext:Port={item.SegTwo.Ext.Port}");
Console.WriteLine($"Seg:Three-Con={item.Seg.Three.Con}");

D. Json
在新建的项目(名为“JsonCfg”)中的Project.json中增加以下的依赖:
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是该依赖库为全局依赖库,非dnx451或dnxcore50下的依赖库。
首先我们在项目根目录下新建一个“config.json”文件并在其中写入如下的内容以便测试:

{
"url": "localhost",
"port": {
"one": 1234,
"two": 456
}
}

然后打开Program.cs文件并在其中写入如下内容:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json");
var provider = new JsonConfigurationProvider(path);
provider.Load(); string url = null;
provider.TryGet("url", out url);
Console.WriteLine($"url={url}"); string one = null;
provider.TryGet("port:one", out one);
Console.WriteLine($"port-one={one}"); string two = null;
provider.TryGet("port:two", out two);
Console.WriteLine($"port0two={two}"); Console.ReadKey();

如何获取某个元素的元素跟Ini方式下是统一的,都是通过冒号来分割。
基本跟之前的还是一样的,笔者还是会给出对应的代码,首先是模型相关的代码:
第一种实现方式:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json");
var provider = new JsonConfigurationProvider(path);
var builder = new ConfigurationBuilder();
builder.Add(provider);
var item = builder.Build().Get<JsonModelCfg>(); Console.WriteLine($"url={item.Url}");
Console.WriteLine($"port-one={item.Port.One}");
Console.WriteLine($"port-two={item.Port.Two}");

第二种实现方式:
E. Xml
在新建的项目(名为“XmlCfg”)中的Project.json中增加以下的依赖:
"Microsoft.Extensions.Configuration.Xml": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Binder": "1.0.0-rc1-final"

需要注意的是该依赖库为全局依赖库,非dnx451或dnxcore50下的依赖库。
在项目根目录下新建一个“config.xml”文件并在其中写入如下内容以便后面的测试:

<settings>
<data>
<con>123456</con>
</data>
<inventory value="test" />
</settings>

然后打开Program.cs文件并在其中写入如下代码:

string path = Path.Combine(Directory.GetCurrentDirectory(), "config.xml");
var provider = new XmlConfigurationProvider(path);
provider.Load(); string con = null;
provider.TryGet("data:con", out con);
Console.WriteLine($"con={con}"); string name = null;
provider.TryGet("inventory:value", out name);
Console.WriteLine($"value={name}"); Console.ReadKey();

对应的模型绑定就不再重复了,完全一模一样了。至此所有的配置相关的内容就介绍完毕了。
.Net Core配置文件的更多相关文章
- .NET Core配置文件加载与DI注入配置数据
.NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config等XML格式的配置文件,而.NET Core中建议使用以JSON为格式的配置文件,因为使用起来更 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-6asp.net core配置文件
asp.net core配置文件 读取配置文件 asp.net core使用appsettings.json代替传统.net framework的web.config中的<appSettin ...
- [转].NET Core配置文件加载与DI注入配置数据
本文转自:http://www.cnblogs.com/skig/p/6079187.html .NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config ...
- .Net Core配置文件介绍
Net Core中的配置文件介绍 1 简单回顾.Net Framework配置文件 .Net Core中的配置文件操作较.Net Framework有了很大的改动.介绍.Net Core中配置文件操作 ...
- asp.net core配置文件
读取配置文件 asp.net core使用appsettings.json代替传统.net framework的web.config中的<appSettings>节点.它的数据格式变成了j ...
- .NET 黑魔法 - asp.net core 配置文件的"对象存储"
来,全都是干货. 我们都知道在Framework版本的mvc项目中,配置数据是通过web.config里的appSettings节点配置,我们不得不写一些读取配置文件字符串的类,比如保存在静态的变量中 ...
- .Net Core配置文件读取整理
一 .配置文件说明 1.配置,主要是 指在程序中使用的一些特殊参数,并且大多数 仅在程序启动的之后指定不需要修改. 2.在以前.Net项目中配置文件主要指app.config或web.config,但 ...
- ASP.NET Core 配置文件(无处不在的依赖注入)
前烟: .NET Core 中取消了以往的 XML 节点配置文件,改用了 *.json 格式. 在 Startup.cs 文件中,构造方法 build appsetting.json 文件, 本文主要 ...
- ASP.NET Core 配置文件
在ASP.NET Core 中,应用程序配置数据可以使用JSON, XML 和 INI格式 和内置环境变量,命令行参数或内存中的集合. 1.如何获取和设置配置 ASP.NET Core配置系统针对以前 ...
随机推荐
- JDBC使用数据库来完成分页功能
本篇讲诉如何在页面中通过操作数据库来完成数据显示的分页功能.当一个操作数据库进行查询的语句返回的结果集内容如果过多,那么内存极有可能溢出,所以在大数据的情况下分页是必须的.当然分页能通过很多种方式来实 ...
- boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET
boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost::crc_32_type crc32; crc32. ...
- 测试kestrel的队列
一.依赖环境的安装 1.sbt wget http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.s ...
- 快速排序的时间复杂度nlogn是如何推导的??
本文以快速排序为例,推导了快排的时间复杂度nlogn是如何得来的,其它算法与其类似. 对数据Data = { x1, x2... xn }: T(n)是QuickSort(n)消耗的时间: P(n)是 ...
- LIS问题分析
题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 原题这个LIS问题,可不是Longest Increasing Subsequence,而是Large ...
- Linux编程实现守护进程
Linux 守护程序 守护进程(Daemon)它是在一个特定的过程的背景进行.它独立于控制终端的和周期性地执行某些任务或待某些事件.是一种非常实用的进程. Linux的大多数server就是用守护进程 ...
- ios添加pre和post build action
再vs中,我们可以很方便的再build前.后执行一些脚本为我们做点什么事情.再ios中怎么搞呢,哪必然是对xcode进行操作了.再google搜索了一把,有说操作Scheme的也有说再直接再targe ...
- 手动配置S2SH三大框架报错(三)
十二月 08, 2013 10:24:43 下午 org.apache.catalina.core.AprLifecycleListener init 严重: An incompatible vers ...
- Webcast / 技术小视频制作方法——自己动手录制video轻松搞定
Webcast / 技术小视频制作方法——自己动手录制video轻松搞定 http://blog.sina.com.cn/s/blog_67d387490100wdnh.html 最近申请加入MSP的 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(三)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果 索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是F ...