10分钟就能学会的.NET Core配置

.NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件、命令行参数、环境变量等读取配置的方法。配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为POCO对象的支持。

目前支持以下配置Provider:

  • 文件(INI,JSON,XML)

  • 命令行参数

  • 环境变量

  • 内存中的.NET对象

  • User Secrets

  • Azure Key Vault

如果现有Provider不能满足你的使用场景,还允许自定义Provider,比如从数据库中读取。

配置相关的包

包管理器中搜索“Microsoft.Extensions.Configuration",所有与配置相关的包都会列举出来

从包的名称基本就可以看出它的用途,比如Microsoft.Extensions.Configuration.Json是Json配置的Provider,Microsoft.Extensions.Configuration.CommandLine是命令行参数配置的Provider,还有.NET Core程序中使用User Secrets存储敏感数据这篇文章中使用的Microsoft.Extensions.Configuration.UserSecrets

文件配置(以Json为例)

Json配置,需要安装Microsoft.Extensions.Configuration.Json包。

命令行下安装执行以下命令

dotnet add package Microsoft.Extensions.Configuration.Json -v 1.1.2

调用AddJsonFile把Json配置的Provider添加到ConfigurationBuilder中。

class Program{    public static IConfigurationRoot Configuration { get; set; }    static void Main(string[] args)    {        var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");Configuration = builder.Build();}
}

如果使用Xml或Ini,只需安装相应的包,然后调用相应的扩展方法AddXmlFile("appsettings.xml)或AddIniFile("appsettings.ini")。

SetBasePath是指定从哪个目录开始查找appsettings.json。如果appsettings.json在configs目录中,那么调用AddJsonFile应该指定的路径为"configs/appsettings.json"。

下面是演示用的Json配置,后面会讲解所有读取它的方法

{"AppId": "12345","Logging": {"IncludeScopes": false,"LogLevel": {"Default": "Debug","System": "Information","Microsoft": "Information"}},"GrantTypes": [{"Name": "authorization_code"},{"Name": "password"},{"Name": "client_credentials"}]}

读取JSON配置

1.使用Key读取

Configuration["AppId"]; // 结果 12345Configuration["Logging:IncludeScopes"]; // 结果 falseConfiguration["Logging:LogLevel:Default"]; // 结果 DebugConfiguration["GrantTypes:0:Name"]; // 结果 authorization_code

读取嵌套的配置,使用冒号隔开;读取数组形式的配置,使用数组的下标索引,0表示第一个。

如在其他地方用到Configuration的时候,可以通过构造函数注入IConfiguration。

首先配置IConfiguration的依赖

services.AddSingleton<IConfiguration>(Configuration);

然后在通过构造函数注入

private readonly IConfiguration _configuration;public GetConfig(IConfiguration configuration){_configuration = configuration;
}

2.使用GetValue<T>
这是一个扩展方法,使用它需要安装Microsoft.Extensions.Configuration.Binder包。

Configuration.GetValue<int>("AppId", 12345); // 结果 12345Configuration.GetValue<bool>("Logging:IncludeScopes", false); // 结果 falseConfiguration.GetValue<string>("Logging:LogLevel:Default", "Debug"); // 结果 DebugConfiguration.GetValue<string>("GrantTypes:0:Name", "authorize_code"); // 结果 authorization_code

GetValue方法的泛型形式有两个重载,一个是GetValue ("key"),另一个可以指定默认值,GetValue ("key",defaultValue)。如果key的配置不存在,第一种的结果为default(T),第二种的结果则为指定的默认值。

3.使用Options
这种方式需要安装Microsoft.Extensions.Options.ConfigurationExtensions包。

调用AddOptions()添加使用Options需要的服务。

services.AddOptions()

定义与配置对应的POCO类

public class MyOptions{   
 public int AppId { get; set; }  
  public LoggingOptions Logging { get; set; }
 public List<GrantType> GrantTypes { get; set; }  
 
  public class GrantType{        public string Name { get; set; }} }public class LoggingOptions{    
  public bool IncludeScopes { get; set; }  
    public LogLevelOptions LogLevel { get; set; } }public class LogLevelOptions{  
     public string Default { get; set; }  
      public string System { get; set; }  
       public string Microsoft { get; set; } }

绑定整个配置到POCO对象上

services.Configure<MyOptions>(Configuration);

也可以绑定特定节点的配置

services.Configure<LoggingOptions>(Configuration.GetSection("Logging"));

services.Configure<LogLevelOptions>(Configuration.GetSection("Logging:LogLevel"));

在需要用到配置的地方,通过构造函数注入,或者直接使用ServiceProvider获取。

private readonly MyOptions _myOptions;public GetConfig(IOptions<MyOptions> myOptionsAccessor){_myOptions = myOptionsAccessor.Value;
}

var myOptionsAccessor = serviceProvider.GetService<IOptions<MyOptions>>();var myOptions = myOptionsAccessor.Value;

4.使用Get<T>
Get<T>是.NET Core 1.1才引入的。

var myOptions = Configuration.Get<MyOptions>();

var loggingOptions = Configuration.GetSection("Logging").Get<LoggingOptions>();

5.使用Bind
Get<T>类似,建议使用Get<T>

var myOptions = new MyOptions();
Configuration.Bind(myOptions);

var loggingOptions = new LoggingOptions();
Configuration.GetSection("Logging").Bind(loggingOptions);

文件变化自动重新加载配置

IOptionsSnapshot支持配置文件变化自动重新加载配置。使用IOptionsSnapshot也很简单,AddJsonFile有个重载,指定reloadOnChange:true即可。

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("configs/appsettings.json", optional: false, reloadOnChange: true);

内存中配置

内存中配置调用AddInMemoryCollection(),其余和Json配置一样。

var dict = new Dictionary<string, string>
{{"AppId","12345"},{"Logging:IncludeScopes","false"},{"Logging:LogLevel:Default","Debug"},{"Logging:LogLevel:System","Information"},{"Logging:LogLevel:Microsoft","Information"},{"GrantTypes:0:Name","authorization_code"},{"GrantTypes:1:Name","password"},{"GrantTypes:2:Name","client_credentials"}
};var builder = new ConfigurationBuilder().AddInMemoryCollection(dict);

var builder = new ConfigurationBuilder().AddInMemoryCollection();Configuration["AppId"] = "12345";

命令行参数配置

命令行参数配置需要安装Microsoft.Extensions.Configuration.CommandLine包。

调用AddCommandLine()扩展方法将命令行配置Provider添加到ConfigurationBuilder中。

var builder = new ConfigurationBuilder().AddCommandLine(args);

传递参数有两种形式

dotnet run /AppId=12345

dotnet run --AppId 12345

如果为--AppId提供一个缩写的参数-a,那么执行dotnet run -a 12345会报在switch mappings中没有-a定义的错误。

幸好AddCommandLine还有一个重载,可以传一个switch mapping。

var builder = new ConfigurationBuilder()
.AddCommandLine(args, new Dictionary<string, string>
{{"-a","AppId"}
});

这样再运行下面的命令就不会报错了。

dotnet run -a 12345

环境变量配置

环境变量配置需要安装Microsoft.Extensions.Configuration.EnvironmentVariables包。

调用AddEnvironmentVariables()扩展方法将环境变量配置Provider添加到ConfigurationBuilder中。

var builder = new ConfigurationBuilder().AddEnvironmentVariables();

获取所有的环境变量

Environment.GetEnvironmentVariables();

根据名称获取环境变量

Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

自定义配置Provider

自定义配置Provider需要继承IConfigurationSource实现自己的配置源,以及继承ConfigurationProvider,重写Load方法。

关于自定义配置Provider,我写了两个开源包,Cxlt.Extensions.Configuration.EF和Cxlt.Extensions.Configuration.Yaml,通过这两个项目,我会详细讲解如何实现自己的配置Provider。文章《实现自己的.NET Core配置Provider之EF》和《实现自己的.NET Core配置Provider之Yaml》过几天也会发布。

配置Provider顺序

.NET Core的配置API允许同时使用多个配置Provider。

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("configs/appsettings.json").AddXmlFile("configs/appsettings.xml").AddCommandLine(args).AddEnvironmentVariables();

如果两个Provider都有相同的配置,那么添加Provider的顺序就非常重要了,因为后加入的会覆盖前面的。

另外建议环境变量的配置Provider放到最后。

最后

.NET Core的配置是很基础的内容,学起来自然不难,基本上动手实践一遍就能掌握。越是简单的东西,在日后的开发中可能帮你节约很多时间。希望这篇文章对你有帮助,请点赞支持一下,也欢迎关注“chengxulvtu"公众号,提前获

原文地址:http://www.cnblogs.com/nianming/p/7083964.html


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

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

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

相关文章

String 使用不当可能导致内存泄露

转载自 String 使用不当可能导致内存泄露 String是Java中一个比较基础的类&#xff0c;每一个开发人员都会经常接触到。而且&#xff0c;String也是面试中经常会考的知识点。String有很多方法&#xff0c;有些方法比较常用&#xff0c;有些方法不太常用。 今天介绍一个Strin…

instanceof关键字

instanceof关键字的使用 a instanceof A:判断对象a是否是类A的实例。如果是&#xff0c;返回true&#xff1b;如果不是&#xff0c;返回false。 使用情境&#xff1a;为了避免在向下转型时出现ClassCastException的异常&#xff0c;我们在向下转型之前&#xff0c;先 进行ins…

王宝兴同学谈学习!

对于学习&#xff0c;我认为心态很重要。只要我们明白就应做什么&#xff0c;此刻需要做什么&#xff0c;才能不断地向前迈进&#xff0c;直至终点。不要怕累。其实谁都一样&#xff0c;学习很累&#xff0c;可这个累只是暂时的。只要坚持下去&#xff0c;努力下去&#xff0c;…

ssl1614-医院设置【图论,最短路】

题目 一个像树一样的无向图&#xff0c;每个点有个值&#xff0c;每条边权值都是1&#xff0c;然后 若医院建在&#xff1a;   1处&#xff0c;则距离和4122*202*40136   3处&#xff0c;则距离和4*213204081 要求距离和最小 输入 第一行一个整数n&#xff0c;表示…

.NET Core运行时和基础类库性能提升

微软宣布改进了.NET Core运行时和基础类库的性能。虽然没有像改进ASP.NET Core的性能那样大肆宣传&#xff0c;但这些改进同样重要。 其中&#xff0c;以下10个方面的变化比较显著&#xff1a;集合、LINQ、压缩、加密、数学运算、序列化、文本处理、文件I/O、网络和并发。至于…

JSP 统计网站访问人数

统计访问人数1 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href"<%basePath%>…

阿里巴巴宣布开源限流降级中间件——Sentinel

转载自 阿里巴巴宣布开源限流降级中间件——Sentinel 近日&#xff0c;阿里巴巴中间件团队宣布开源 Sentinel&#xff0c;并发布了首个社区版本v0.1.0。GitHub地址为&#xff1a;https://github.com/alibaba/Sentinel 。 关于Sentinel&#xff0c;阿里巴巴给出的描述比较简单…

张君豪同学谈学习

开学也快一个月了&#xff0c;也渐渐适应了学校生活&#xff0c;与同学一起非常的开心&#xff0c;老师讲的课也听得更认真了&#xff0c;回想一下&#xff0c;过去的几周&#xff0c;还是有不少的感想啊&#xff0c;于是我就粗略的总结一下。因为某些原因&#xff0c;导致晚开…

== 和 equals() 区别

一、回顾 的使用&#xff1a;&#xff1a;运算符 1. 可以使用在基本数据类型变量和引用数据类型变量中 2. 如果比较的是基本数据类型变量&#xff1a;比较两个变量保存的数据是否相等。&#xff08;不一定类型要相同&#xff09;如果比较的是引用数据类型变量&#xff1a;比较…

JSP 登录案例实现

<h3>用户登录</h3> <form action"doLogin.jsp"> 账号&#xff1a;<input type"text" name"zh"/> 密码&#xff1a;<input type"password" name"pwd"> <input type"sub…

.NET Core 2.0 Preview2 发布汇总

前言 关于 ASP.NET Core 2.0 的新功能可以查看 Amazing ASP.NET Core 2.0。 这篇文章是 Priview2中的一些改进。 .NET Core 2.0 - Preview2 Azure 的改进Docker 镜像转移到了 Debian Stretch修复并支持 macOS High Sierra质量和性能的改进dotnet restore 将在 dotnet run,pu…

ssl1624-小萨的烦恼【图论,最短路,Floyd】

题目 一个图&#xff0c;只有一次快速的机会&#xff0c;不快速就得花双倍价格&#xff0c;求点1到点s的最短路&#xff0c;然后*2输出 输入 第一行有三个整数N、T、S 接下来是一个N*N的邻接矩阵。两点之间的距离不超过10^9。A[i,j]为0表示i和j不连通。 4 5 4 0 1 1 1 1…

再有人问你volatile是什么,就把这篇文章发给他

转载自 再有人问你volatile是什么&#xff0c;就把这篇文章发给他 在再有人问你Java内存模型是什么&#xff0c;就把这篇文章发给他中我们曾经介绍过&#xff0c;Java语言为了解决并发编程中存在的原子性、可见性和有序性问题&#xff0c;提供了一系列和并发处理相关的关键字…

端午前夕的班级小游戏

文章原创&#xff1a;高启航同学文章编辑&#xff1a;穆雄雄今天2020年6月24号&#xff0c;端午节放假前夕一早&#xff0c;依旧照常的早自习&#xff0c;同学们抵抗着困倦都在尽力而为的阅读笔记&#xff0c;虽然有些小不情愿&#xff0c;但声音还是很大。今天是班主任以及班委…

ssl1257-产生数【图论,最短路】

题目 给出一个整数 n&#xff08;n<10^30) 和 k 个变换规则&#xff08;k<15&#xff09;。   规则&#xff1a;    一位数可变换成另一个一位数&#xff1a;    规则的右部不能为零。   例如&#xff1a;n234。有规则&#xff08;k&#xff1d;2&#xf…

Servlet 流程控制

在之前的登陆例子里面所有的代码都是放到了jsp的页面中&#xff0c;但是JSP是负责显示的&#xff0c;现在用于了流程控制&#xff0c;这样十分不妥&#xff0c;所以我们把代码提取到了servlet里面 代码实现 Login.jsp <h3>用户登录</h3> <form action"…

TCP 三次握手原理,你真的理解吗

转载自 TCP 三次握手原理&#xff0c;你真的理解吗 最近&#xff0c;阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常。在反复定位分析、并查阅各种资料文章搞懂后&#xff0c;他发现没有文章把这两个队列以及怎么观察他们的指标说清楚。 因此&#xff0…

属于你们的“礼仪小课堂”

2020年7月2日&#xff0c;对于3班的孩子们来说&#xff0c;是个无比重要的日子。在于老师&#xff08;6班班主任&#xff09;和王老师&#xff08;3班班主任&#xff09;紧锣密鼓的准备下&#xff0c;终于在我们班内开展了以“礼仪”为主题的专题讲解&#xff0c;此次讲解的主角…

.Net程序调试与追踪的一些方法

前言 作为一个.net开发工程师&#xff0c;不管是在写桌面程序、服务程序或web程序&#xff0c;在开发阶段&#xff0c;我们必须非常熟悉vs的动态调试技能&#xff0c;当然web程序可能还需要调试前端的脚本或样式&#xff0c;这不在本文的讨论范围。本文主要介绍vs的动态调试基…

toString()

Object类中toString()的使用&#xff1a; 1. 当我们输出一个对象的引用时&#xff0c;实际上就是调用当前对象的toString() 2. Object类中toString()的定义&#xff1a;public String toString() {return getClass().getName() "" Integer.toHexString(hashCode())…