.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文件在其中写入以下的程序:

 

这里我们可以看到“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”:


其中我们可以看到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中尝试获取我们需要的值如果有值则立即返回,而模型绑定是通过对其扩展加进去的。具体扩展了以下的方法:


其实现在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,比如这个方法的内部实现如下:

到这里关于命令行参数告一段落,如果读者想了解更多的信息,可以查看对应的源码以及单元测试。 

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.113Ext:Port=5535[Seg:Three]
Con=192.169.12.12

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


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

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


第一种实现方式:


 

第二种实现方式:


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文件并在其中写入如下内容:


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

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

第一种实现方式:

第二种实现方式:

 

 

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文件并在其中写入如下代码:

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

相关文章:

  • ASP.NET Core 1.0 入门——了解一个空项目

  • ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)

  • .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

  • 云服务器下ASP.NET Core 1.0环境搭建(包含mono与coreclr)

  • 使用VS Code开发ASP.NET Core 应用程序

  • dotnet run是如何启动asp.net core站点的

  • ASP.NET Core提供模块化Middleware组件

  • “dotnet restore"和"dotnet run"都做了些什么?

  • 探秘 dotnet run 如何运行 .NET Core 应用程序

  • .NET Portability Analyzer 已开源

  • ASP.NET Core的配置(1):读取配置信息

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


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python短视频自动制作_Python 带你一键生成朋友圈超火的九宫格短视频

1. 场景如果你经常刷抖音和微信朋友圈&#xff0c;一定发现了最近九宫格短视频很火&#xff01;​从朋友圈九宫格图片&#xff0c;到九宫格视频&#xff0c;相比传统的图片视频&#xff0c;前者似乎更有个性和逼格除了传统的剪辑软件可以实现&#xff0c;是否有其他更加快捷方便…

3-系统总线

【README】 1.本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 2.补充&#xff1a;冯洛伊曼计算机由5大部分组成&#xff1a; 1. 运算器2. 控制器3. 存储器4. 输入设备5. …

HashMap中傻傻分不清楚的那些概念

转载自 HashMap中傻傻分不清楚的那些概念 很多人在通过阅读源码的方式学习Java&#xff0c;这是个很好的方式。而JDK的源码自然是首选。在JDK的众多类中&#xff0c;我觉得HashMap及其相关的类是设计的比较好的。很多人读过HashMap的代码&#xff0c;不知道你们有没有和我一样&…

HoloLens开发手记-硬件细节 Hardware Detail

微软HoloLens是世界第一款完全无线缆的全息计算机。通过在新方式上赋予用户的全息体验&#xff0c;HoloLens重新定义了个人计算&#xff08;Personal Computing&#xff09;。为了将3D全息图形固定到你周围的真实世界中&#xff0c;HoloLens融合了最先进的光学元件和传感器。 设…

super构造方法为什么给子类赋值_【Java学习 | Javase】super

整理自&#xff1a;动力节点基础讲义super概述 严格来说&#xff0c;super其实并不是一个引用&#xff0c;它只是一个关键字&#xff0c;super代表了当前对象中从父类继承过来的那部分特征。换句话说&#xff0c;super其实是this的一部分&#xff0c;从父类继承过来的属性和方法…

4-存储器

【README】 1.本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】概述 【1.1】存储器分类 1&#xff09;按存储介质分类 1&#xff0c; 半导体存储器&#xff0c;分为 TTL&#…

坑爹的日志无法按天切割问题

转载自 坑爹的日志无法按天切割问题问题背景 线上某个新管理型系统出现了日志无法按天切割生成日志文件的问题&#xff0c;所有的日志都在一个日志文件里面&#xff0c;只有每次重启的时候才会重新生成文件。 这个管理系统使用的是 Spring Boot Logback 框架&#xff0c;查看了…

Asp.net 面向接口框架之应用程序上下文作用域组件

在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项目使用只需要复制配置和调用接口即可)也很好扩展(操作的数据库、表、资源等都可以配置)。 但是由于当时开发的匆忙(边开发边应用),…

投票源码程序_[内附完整源码和文档] 基于JSP实现的影视创作论坛系统

摘 要随着时代的发展&#xff0c;互联网的出现&#xff0c;给传统影视行业带来的最大便利就是&#xff0c;方便了影视从业人员以及爱好者的交流和互动&#xff0c;而为用户提供一个书写影评&#xff0c;阅读影评以及回复影评的平台&#xff0c;以影评为载体来使用户感受影评、解…

5-输入输出系统IO

【README】 1.本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】 IO概述 【1.1】输入输出系统的发展概况 通道&#xff08;通道是netty的io多路复用的底层原理&#xff0c;需要重点了…

Java中的基本数据类型转换(自动、强制、提升)

转载自 Java中的基本数据类型转换&#xff08;自动、强制、提升&#xff09; 说基本数据类型转换之前&#xff0c;先了解下 Java 中的 8 种基本数据类型&#xff0c;以及它们的占内存的容量大小和表示的范围&#xff0c;如下图所示。 重新温故了下原始数据类型&#xff0c;现在…

我是这样入侵 Hacking Team 的

在意大利间谍软件厂商 Hacking Team 的内部邮件和文档被曝光将近一年后&#xff0c;黑掉这家黑客公司的黑客公开了他如何入侵HT的完整细节。该文档于上周六在网上发布&#xff0c;本意是为了给黑客活动人士的一份指南。但对于安全从业人员来说&#xff0c;则意味着当任何企业或…

python 数据分析 书籍推荐 知乎_Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!...

原标题&#xff1a;Python 爬取知乎 9674 个问答&#xff0c;揭秘最受欢迎的 98 本书&#xff01;作者 | Yura责编 | 胡巍巍高尔基这话有没有道理我不知道&#xff0c;咱也不敢问&#xff0c;主要是现在也问不了。那对我来说&#xff0c;读书有什么意义呢&#xff1f;应该也是阶…

分布式作业 Elastic-Job 快速上手指南

转载自 分布式作业 Elastic-Job 快速上手指南Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务&#xff0c;这里我们使用 JAVA API 的形式来创建一个简单的任务入门&#xff0c;现在都是 Spring Boot 时代了&#xff0c;所以不建议使用 Spring 配置文件的形式。 Elast…

7-指令系统

README】 1.本文总结自bilibili《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 机器指令&#xff1a; CPU能够识别并且执行的操作命令&#xff1b;有可以理解为不同cpu&#xff0c;在生产时预设了一组…

WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

最近出于工作需要&#xff0c;了解了一下微服务架构&#xff08;Microservice Architecture&#xff0c;MSA&#xff09;。我经过两周业余时间的努力&#xff0c;凭着自己对微服务架构的理解&#xff0c;从无到有&#xff0c;基于.NET打造了一个演示微服务架构的应用程序案例&a…

常用的数据交换格式有哪些_高程数据格式介绍

高程数据格式介绍1 概述目前业内常用的地形数据格式有img,tif,grp及dem,其中dem在地形表达中能力最强&#xff0c;效果最好&#xff0c;本文围绕dem的数据格式进行介绍。2 DEM简介数字高程模型(Digital Elevation Model)&#xff0c;简称DEM&#xff0c;是通过有限的地形高程数…

switch case 支持的 6 种数据类型

转载自 switch case 支持的 6 种数据类型那么今天就讲一下 Java 中的 switch case 语句吧&#xff0c;有忘记的同学正好可以温习一下。 Java 中 switch case 语句用来判断一个变量与一系列值中某个值是否相等&#xff0c;每个值称为一个分支。 语法格式如下&#xff1a; switc…

1-操作系统启动前的工作

【README】 1.本文总结自B站《操作系统&#xff08;哈工大李治军老师&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】计算机上电 1&#xff09; 问题&#xff1a; 这神秘的黑色背后发生了什么 &#xff1f;计算机是怎么工作的&#x…

傅里叶变换公式_理解1维傅里叶变换

上个学期&#xff0c;学习了信号与系统。虽然知道了傅里叶变换的作用以及如何使用。但是对于它的本质&#xff0c;也就是FT是如何探测到频率的尚有疑惑。而恰好在知乎上发现了一些很好的回答。故将这些回答整理在这。感性理解1维FT知友Heinrich写的傅里叶分析之掐死教程&#x…