.Net Core下如何管理配置文件(转载)
原文地址: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文件在其中写入以下的程序:
public static void Main(string[] args){var cmdLineConfig = new CommandLineConfigurationProvider(args);cmdLineConfig.Load();string value1 = null;cmdLineConfig.TryGet("key1", out value1);Console.WriteLine($"key1={value1}");Console.ReadKey();}
这里我们可以看到“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,比如这个方法的内部实现如下:
public static IConfigurationBuilder AddCommandLine(this IConfigurationBuilder configurationBuilder, string[] args){configurationBuilder.Add(new CommandLineConfigurationProvider(args));return configurationBuilder;}
到这里关于命令行参数告一段落,如果读者想了解更多的信息,可以查看对应的源码以及单元测试。
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文件写入如下代码去读取配置文件中的内容:
public static void Main(string[] args) {string path = Path.Combine(Directory.GetCurrentDirectory(), "config.ini");var provider = new IniConfigurationProvider(path);provider.Load();string segoneCon = null;provider.TryGet("SegOne:Con", out segoneCon);Console.WriteLine($"SegOne-Con={segoneCon}");string segtwoCon = null;provider.TryGet("SegTwo:Con", out segtwoCon);Console.WriteLine($"SegTwo-Con={segtwoCon}");string segtwoExtPort = null;provider.TryGet("SegTwo:Ext:Port", out segtwoExtPort);Console.WriteLine($"SegTwo-Ext:Port={segtwoExtPort}");string segthreeCon = null;provider.TryGet("Seg:Three:Con", out segthreeCon);Console.WriteLine($"Seg:Three-Con={segthreeCon}");Console.ReadKey(); }
相同很多人都看见过类似的配置文件,特别是在搭建一些服务的时候,那么从.net core开始也将原生支持这些配置,当然上面的示例中没有给出对应的注释,对应的注释要以“;”、“#”和“/”开头即可。
因为在该结构下会存在复杂类型包含复杂类型的情况,所以下面我们的模型可能比较复杂:
public class IniModelCfg{public SegOne SegOne { get; set; }public SegTwo SegTwo { get; set; }public Seg Seg { get; set; }}public class SegOne{public string Con { get; set; }}public class SegTwo{public string Con { get; set; }public Ext Ext { get; set; }}public class Ext{public string Port { get; set; }}public class Seg{public Three Three { get; set; }}public class Three{public string Con { get; set; }}
第一种实现方式:
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方式下是统一的,都是通过冒号来分割。
基本跟之前的还是一样的,笔者还是会给出对应的代码,首先是模型相关的代码:
public class JsonModelCfg{public string Url { get; set; }public Port Port { get; set; }}public class Port{public string One { get; set; }public string Two { get; set; }}
第一种实现方式:
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}");
第二种实现方式:
string path = Path.Combine(Directory.GetCurrentDirectory(), "config.json"); var builder = new ConfigurationBuilder(); builder.AddJsonFile(path); 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();
对应的模型绑定就不再重复了,完全一模一样了。至此所有的配置相关的内容就介绍完毕了。
转载于:https://www.cnblogs.com/piscesLoveCc/p/5662776.html
.Net Core下如何管理配置文件(转载)相关推荐
- .Net Core下如何管理配置文件
一.前言 根据该issues来看,System.Configuration在.net core中已经不存在了,那么取而代之的是由Microsoft.Extensions.Cnfiguration.XX ...
- linux 下用户管理
linux 下用户管理 一.用户的分类 1.超级用户:root UID=0 2.系统用户:不需要登录系统,对应用程序服务,主要维护系统的正常运行:UID = 1 ~ 499(RHEL7 = 1 ~ 9 ...
- [转]ASP.NET Core基本原理(11)-管理应用程序状态
本文转自:http://zhuchenglin.me/fundamentals-11-app-state?utm_source=tuicool&utm_medium=referral ASP. ...
- nacos怎么修改服务分组_Nacos(六):多环境下如何“管理”及“隔离”配置和服务...
前言 前景回顾: 现如今,在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境.测试环境.正式环境 我们来说算一算,假设某系统有10个微服务,那么 ...
- apollo 配置中心_.NET Core 下使用 Apollo 配置中心
" Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置 ...
- metrics类型 普罗米修斯_AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控...
原标题:AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控 概述 Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由S ...
- vim末行模式下相关操作+配置文件
vim配置文件 -用户级别 ~/.vimrc -系统级别 /etc/vim/vimrc vim末行模式下相关操作 a.从命令模式->末行模式 i.键盘录入冒号(:) 保存退出 保存不退出: ...
- Linux下用户管理
Linux下用户管理 linux下用户管理有两个重要的配置文件 一个是:/etc/shadow #保存的是用户的密码信息 另一个是:/etc/pas ...
- 一个.NET Core下的开源插件框架Pluginfactory
插件模式历史悠久,各种中大型软件基本上都会实现插件机制,以此支持功能扩展,从开发部署层面,插件机制也可实现功能解耦,对于并行开发.项目部署.功能定制等都有比较大的优势. 在.NET Core下,一般我 ...
- .NET Core下使用gRpc公开服务(SSL/TLS)
一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇 ...
最新文章
- 我想说进厂打工怎么就丢人了
- Docker安装elasticsearch-head监控ES步骤 - gmijie的专栏 - CSDN博客
- Shell 中 exit 和 return 的区别
- ppt flash倒计时器_央视都在分享的9个PPT小技巧 帮你搞定职场烦心事
- 优麒麟使用教程第四期:Linux平台U盘启动盘制作(建议收藏)
- 计算机科技英语论文,计算机科技英语论文大纲模板 计算机科技英语论文提纲怎么写...
- Pascal VOCdata数据集读取(pytorch)
- 把EditPlus添加到右键快捷菜单
- 图像操作(反差,混合,调整图像亮度与对比度,绘制文字)
- 纯js实现俄罗斯方块详解与源码
- 新版SpringCloudGateway网关 切面修改方法入参
- 对话奥比中光CV博士:今年三维重建与计算机视觉可以关注哪些热点?
- (18)ROS学习-TF坐标变换之静态坐标变换
- 少儿编程入门应该从机器人Scratch编程开始
- CDA_Level 1_学习笔记2
- 如何抢走亚马逊竞品手上的客户和流量?
- OpenCV人脸识别的原理 .
- #ORA-12547: TNS: 丢失连接
- WIN7系统安装及动态分区详解步骤
- 计算机测试培训经历,学习经历经验分享
热门文章
- Redis Scan返回数据量大于Limit的Count原因分析
- 【渝粤教育】电大中专职业生涯规划_1作业 题库
- 【Python实例第33讲】单变量特征选择
- C# AE axGlobeControl The 3D Analyst extension has not been enabled.
- 简单易懂之python 中的map,filter,reduce用法
- Sphere-AABB Intersecting test
- (转)Spring实现IoC的多种方式
- 【转】OpenGL版本与OpenGL扩展机制
- hdmi中深度色彩像素打包
- C#设计模式之十八状态模式(State Pattern)【行为型】