原文地址:http://www.cnblogs.com/yaozhenfa/p/5408009.html

一、前言

根据该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”:

  1. public static void Main(string[] args)
  2. {
  3. Dictionary<string, string> defaults = new Dictionary<string, string>
  4. {
  5. { "--Key1","key2" }
  6. };
  7.  
  8. var cmdLineConfig = new CommandLineConfigurationProvider(args, defaults);
  9. cmdLineConfig.Load();
  10.  
  11. string value1 = null;
  12. cmdLineConfig.TryGet("key2", out value1);
  13. Console.WriteLine($"key1&key2={value1}");
  14.  
  15. Console.ReadKey();
  16. }

其中我们可以看到defaults字典中的key必须加上“--”或“-”否则在调用构造函数时将会抛出ArgumentException异常。最终我们可以看到获取值的时候是利用后来我们投影之后的key的名称去获取而不是“key1”了。

除了通过上面这种方式获取值之外,还提供了一个通用的模型绑定,能够将其他的格式转换为POCO,这样能够便于我们更快速的开发,下面笔者将通过两种方式来讲述,首先是利用我们当前已经创建好的Provider来进行Bind,其中POCO如下:

  1. public class CommandLineArgs
  2. {
  3. public string Key1 { get; set; }
  4. }

Main方法的实现如下:

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

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

  1. public static class ConfigurationBinder
  2. {
  3. public static void Bind(this IConfiguration configuration, object instance);
  4. public static object Get(this IConfiguration configuration, Type type);
  5. public static object Get(this IConfiguration configuration, Type type, string key);
  6. public static T Get<T>(this IConfiguration configuration);
  7. public static T Get<T>(this IConfiguration configuration, T defaultValue);
  8. public static T Get<T>(this IConfiguration configuration, string key);
  9. public static T Get<T>(this IConfiguration configuration, string key, T defaultValue);
  10. }

其实现在Microsoft.Extensions.Configuration.Binder中。

另一种方式则是不通过创建CommandLineConfigurationProvider直接利用ConfigurationBuilder实现相同的效果:

  1. var builder = new ConfigurationBuilder();
  2. builder.AddCommandLine(args);
  3. var item = builder.Build().Get<CommandLineArgs>();
  4. 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写入以下的程序:

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

我们可以看到跟上一节的方式是一模一样的,这样对于我们今后自己进行扩展来说,就避免的我们系统内部的修改。

如果读者细心查看provider中的Data会发现其中不仅仅保存我们的配置信息还保存了大量的系统配置信息,这是因为在调用Load的时候内部还将系统配置信息也读取了,对应的源码如下:

  1. public override void Load()
  2. {
  3. Load(Environment.GetEnvironmentVariables());
  4. }

在我们初始化provider时可以看到构造函数还支持prefix,那么下面我们利用prefix来定义一个拥有自己前缀的配置避免跟其他的配置信息相互冲突:

  1. var provider = new EnvironmentVariablesConfigurationProvider("cfg:");
  2. provider.Load();
  3.  
  4. string value = null;
  5. provider.TryGet("con", out value);
  6. Console.WriteLine($"con={value}");
  7.  
  8. Console.ReadKey();

读者还要记得到项目的属性中将环境配置中的变量的key改成cfg:Con,否则value获取出来的就是null了。

相信聪明的读者已经知道对应的如何使用了,所以笔者在这里只列出对应的代码(两种方式)。

  1. public class EnvirVarCfg
  2. {
  3. public string Con { get; set; }
  4. }

方式1:

  1. var provider = new EnvironmentVariablesConfigurationProvider("cfg:");
  2. var builder = new ConfigurationBuilder();
  3. builder.Add(provider);
  4. var item = builder.Build().Get<EnvirVarCfg>();
  5. Console.WriteLine($"con={item.Con}");

方式2:

  1. var builder = new ConfigurationBuilder();
  2. builder.AddEnvironmentVariables("cfg:");
  3. var item = builder.Build().Get<EnvirVarCfg>();
  4. 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”文件,并在其中写入如下的内容以便我们读取:

  1. [SegOne]
  2. Con=localhost
  3.  
  4. [SegTwo]
  5. Con=192.168.1.113
  6. Ext:Port=
  7.  
  8. [Seg:Three]
  9. Con=192.169.12.12

然后我们打开Program.cs文件写入如下代码去读取配置文件中的内容:

  1. public static void Main(string[] args)
  2. {
  3.   string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini");
  4.   var provider = new IniConfigurationProvider(path);
  5.   provider.Load();
  6.  
  7.   string segoneCon = null;
  8.   provider.TryGet("SegOne:Con", out segoneCon);
  9.   Console.WriteLine($"SegOne-Con={segoneCon}");
  10.  
  11.   string segtwoCon = null;
  12.   provider.TryGet("SegTwo:Con", out segtwoCon);
  13.   Console.WriteLine($"SegTwo-Con={segtwoCon}");
  14.  
  15.   string segtwoExtPort = null;
  16.   provider.TryGet("SegTwo:Ext:Port", out segtwoExtPort);
  17.   Console.WriteLine($"SegTwo-Ext:Port={segtwoExtPort}");
  18.  
  19.   string segthreeCon = null;
  20.   provider.TryGet("Seg:Three:Con", out segthreeCon);
  21.   Console.WriteLine($"Seg:Three-Con={segthreeCon}");
  22.  
  23.   Console.ReadKey();
  24. }

相同很多人都看见过类似的配置文件,特别是在搭建一些服务的时候,那么从.net core开始也将原生支持这些配置,当然上面的示例中没有给出对应的注释,对应的注释要以“;”、“#”和“/”开头即可。

因为在该结构下会存在复杂类型包含复杂类型的情况,所以下面我们的模型可能比较复杂:

  1. public class IniModelCfg
  2. {
  3. public SegOne SegOne { get; set; }
  4. public SegTwo SegTwo { get; set; }
  5. public Seg Seg { get; set; }
  6. }
  7.  
  8. public class SegOne
  9. {
  10. public string Con { get; set; }
  11. }
  12.  
  13. public class SegTwo
  14. {
  15. public string Con { get; set; }
  16. public Ext Ext { get; set; }
  17. }
  18.  
  19. public class Ext
  20. {
  21. public string Port { get; set; }
  22. }
  23.  
  24. public class Seg
  25. {
  26. public Three Three { get; set; }
  27. }
  28.  
  29. public class Three
  30. {
  31. public string Con { get; set; }
  32. }

第一种实现方式:

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

第二种实现方式:

  1. string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini");
  2. var builder = new ConfigurationBuilder();
  3. builder.AddIniFile(path);
  4. var item = builder.Build().Get<IniModelCfg>();
  5.  
  6. Console.WriteLine($"SegOne-Con={item.SegOne.Con}");
  7. Console.WriteLine($"SegTwo-Con={item.SegTwo.Con}");
  8. Console.WriteLine($"SegTwo-Ext:Port={item.SegTwo.Ext.Port}");
  9. 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”文件并在其中写入如下的内容以便测试:

  1. {
  2. "url": "localhost",
  3. "port": {
  4. "one": ,
  5. "two":
  6. }
  7. }

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

  1. string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json");
  2. var provider = new JsonConfigurationProvider(path);
  3. provider.Load();
  4.  
  5. string url = null;
  6. provider.TryGet("url", out url);
  7. Console.WriteLine($"url={url}");
  8.  
  9. string one = null;
  10. provider.TryGet("port:one", out one);
  11. Console.WriteLine($"port-one={one}");
  12.  
  13. string two = null;
  14. provider.TryGet("port:two", out two);
  15. Console.WriteLine($"port0two={two}");
  16.  
  17. Console.ReadKey();

如何获取某个元素的元素跟Ini方式下是统一的,都是通过冒号来分割。

基本跟之前的还是一样的,笔者还是会给出对应的代码,首先是模型相关的代码:

  1. public class JsonModelCfg
  2. {
  3. public string Url { get; set; }
  4. public Port Port { get; set; }
  5. }
  6.  
  7. public class Port
  8. {
  9. public string One { get; set; }
  10. public string Two { get; set; }
  11. }

第一种实现方式:

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

第二种实现方式:

  1. string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json");
  2. var builder = new ConfigurationBuilder();
  3. builder.AddJsonFile(path);
  4. var item = builder.Build().Get<JsonModelCfg>();
  5.  
  6. Console.WriteLine($"url={item.Url}");
  7. Console.WriteLine($"port-one={item.Port.One}");
  8. 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”文件并在其中写入如下内容以便后面的测试:

  1. <settings>
  2. <data>
  3. <con></con>
  4. </data>
  5. <inventory value="test" />
  6. </settings>

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

  1. string path = Path.Combine(Directory.GetCurrentDirectory(), "config.xml");
  2. var provider = new XmlConfigurationProvider(path);
  3. provider.Load();
  4.  
  5. string con = null;
  6. provider.TryGet("data:con", out con);
  7. Console.WriteLine($"con={con}");
  8.  
  9. string name = null;
  10. provider.TryGet("inventory:value", out name);
  11. Console.WriteLine($"value={name}");
  12.  
  13. Console.ReadKey();

对应的模型绑定就不再重复了,完全一模一样了。至此所有的配置相关的内容就介绍完毕了。

.Net Core下如何管理配置文件(转载)的更多相关文章

  1. .Net Core下如何管理配置文件

    一.前言 根据该issues来看,System.Configuration在.net core中已经不存在了,那么取而代之的是由Microsoft.Extensions.Cnfiguration.XX ...

  2. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  3. 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model

    利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model   使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...

  4. Nacos(六):多环境下如何“管理”及“隔离”配置和服务

    前言 前景回顾: Nacos(五):多环境下如何"读取"Nacos中相应环境的配置 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 现如今,在微服务体系中 ...

  5. .net core之编辑json配置文件

    .net core之编辑json配置文件 引言 最近在具体项目开发应用中,项目采用的json格式配置文件,配置文件的加载采用的IConfiguration接口对象进行的管理,这是.net standa ...

  6. .NET Core 下使用 Apollo 配置中心

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景.服务 ...

  7. .NET Core下使用gRpc公开服务(SSL/TLS)

    一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇 ...

  8. linux 下用户管理

    linux 下用户管理 一.用户的分类 1.超级用户:root UID=0 2.系统用户:不需要登录系统,对应用程序服务,主要维护系统的正常运行:UID = 1 ~ 499(RHEL7 = 1 ~ 9 ...

  9. 【转】Linux下XenServer管理工具安装

    转载文章 - Linux下XenServer管理工具安装 Xen-Server 6.5 虚拟机安装Linux系统 vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) ...

随机推荐

  1. JavaFX前言

    笔者在一家互联网公司做JavaEE开发,公司开发了移动端的产品,唯独没有PC端的产品,于是领导将任务分配给笔者. 使用Java开发PC客户端,我的第一反应是使用swing API.但是,产品的需求是客 ...

  2. Tested work with China Digiprog 3 4.94 mileage programmer

    I was thinking about buying a Digiprog3 clone from China I know that YANHUA Digiprog 3 is the best a ...

  3. OC之Block的用法和实现委托

    Block的基本概念 Block的基本用法 Block实现委托机制 一.Block的基本概念 Block是程序的代码块,这个代码块可以在需要的时候执行.IOS开发中,block到处可见,所以学好很重要 ...

  4. OC之category的用法

    简介 实例 好处 一.category简介 动态的为某个已经存在的类增加方法,不可以增加成员变量 二.实例 // // Student+CatetoryStudent.h // Category // ...

  5. JQuery POST请求乱码...

    引言: 在JQuery的Ajax POST请求中,进行请求,其中的中文在后台,显示为乱码,该如何解决呢? 问题的引入: var regid = $('#oregion').combobox('getV ...

  6. 使用SFTP上传文件到服务器的简单使用

    最近用到SFTP上传文件查找了一些资料后自己做了一点总结,方便以后的查询 /** * 将文件上传到服务器 * * @param filePath * 文件路径 * @param channelSftp ...

  7. mysql-DDL-创建数据库

    创建一个数据库 • 建立数据库操作: 语法: create database 数据库名 叙述:创建一个具有指定名称的数据库.如果要创建的 数据库已经存在,或者没有创建它的适当权限,则此 语句失败. 例 ...

  8. 怒刷DP之 HDU 1257

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  9. sharepoint 2013 "The module ... owssvr.dll could not be loaded due to a configuration problem"

    打开sharepoint站点可以看到这个503的错误, 在event viewer中查看如下: The Module DLL 'C:\Program Files\Common Files\Micros ...

  10. JavaScript--正则表达式(笔记)

    一 什么是正则表达式 // 正则表达式(regular expression)是一个描述字符模式的对象; // JS定义RegExp类表示正则表达式; // String和RegExp都定义了使用正则 ...