一、简介

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包。

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

  1. dotnet add package Microsoft.Extensions.Configuration.Json -v 1.1.

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

  1. class Program
  2. {
  3. public static IConfigurationRoot Configuration { get; set; }
  4.  
  5. static void Main(string[] args)
  6. {
  7. var builder = new ConfigurationBuilder()
  8. .SetBasePath(Directory.GetCurrentDirectory())
  9. .AddJsonFile("appsettings.json");
  10.  
  11. Configuration = builder.Build();
  12. }
  13. }

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

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

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

  1. {
  2. "AppId": "",
  3. "Logging": {
  4. "IncludeScopes": false,
  5. "LogLevel": {
  6. "Default": "Debug",
  7. "System": "Information",
  8. "Microsoft": "Information"
  9. }
  10. },
  11. "GrantTypes": [
  12. {
  13. "Name": "authorization_code"
  14. },
  15. {
  16. "Name": "password"
  17. },
  18. {
  19. "Name": "client_credentials"
  20. }
  21. ]
  22. }

(一)、读取JSON配置

1.使用Key读取

  1. Configuration["AppId"]; // 结果 12345
  2. Configuration["Logging:IncludeScopes"]; // 结果 false
  3. Configuration["Logging:LogLevel:Default"]; // 结果 Debug
  4. Configuration["GrantTypes:0:Name"]; // 结果 authorization_code

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

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

首先配置IConfiguration的依赖

  1. services.AddSingleton<IConfiguration>(Configuration);

然后在通过构造函数注入

  1. private readonly IConfiguration _configuration;
  2. public GetConfig(IConfiguration configuration)
  3. {
  4. _configuration = configuration;
  5. }

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

  1. Configuration.GetValue<int>("AppId", ); // 结果 12345
  2. Configuration.GetValue<bool>("Logging:IncludeScopes", false); // 结果 false
  3. Configuration.GetValue<string>("Logging:LogLevel:Default", "Debug"); // 结果 Debug
  4. Configuration.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需要的服务。

  1. services.AddOptions()

定义与配置对应的POCO类

  1. public class MyOptions
  2. {
  3. public int AppId { get; set; }
  4.  
  5. public LoggingOptions Logging { get; set; }
  6.  
  7. public List<GrantType> GrantTypes { get; set; }
  8.  
  9. public class GrantType
  10. {
  11. public string Name { get; set; }
  12. }
  13. }
  14.  
  15. public class LoggingOptions
  16. {
  17. public bool IncludeScopes { get; set; }
  18.  
  19. public LogLevelOptions LogLevel { get; set; }
  20. }
  21.  
  22. public class LogLevelOptions
  23. {
  24. public string Default { get; set; }
  25.  
  26. public string System { get; set; }
  27.  
  28. public string Microsoft { get; set; }
  29. }

绑定整个配置到POCO对象上

  1. services.Configure<MyOptions>(Configuration);

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

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

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

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

  1. private readonly MyOptions _myOptions;
  2. public GetConfig(IOptions<MyOptions> myOptionsAccessor)
  3. {
  4. _myOptions = myOptionsAccessor.Value;
  5. }

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

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

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

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

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

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

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

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

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

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

(二)、内存中配置

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

  1. var dict = new Dictionary<string, string>
  2. {
  3. {"AppId",""},
  4. {"Logging:IncludeScopes","false"},
  5. {"Logging:LogLevel:Default","Debug"},
  6. {"Logging:LogLevel:System","Information"},
  7. {"Logging:LogLevel:Microsoft","Information"},
  8. {"GrantTypes:0:Name","authorization_code"},
  9. {"GrantTypes:1:Name","password"},
  10. {"GrantTypes:2:Name","client_credentials"}
  11. };
  12.  
  13. var builder = new ConfigurationBuilder()
  14. .AddInMemoryCollection(dict);

  1. var builder = new ConfigurationBuilder()
  2. .AddInMemoryCollection();
  3.  
  4. Configuration["AppId"] = "";

(三)、命令行参数配置

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

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

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

传递参数有两种形式

  1. dotnet run /AppId=

  1. dotnet run --AppId

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

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

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

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

  1. dotnet run -a

(四)、环境变量配置

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

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

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

获取所有的环境变量

  1. Environment.GetEnvironmentVariables();

根据名称获取环境变量

  1. Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

(五)、配置Provider顺序

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

  1.  
  1. var builder = new ConfigurationBuilder()
  2. .SetBasePath(Directory.GetCurrentDirectory())
  3. .AddJsonFile("configs/appsettings.json")
  4. .AddXmlFile("configs/appsettings.xml")
  5. .AddCommandLine(args)
  6. .AddEnvironmentVariables();

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

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

参考资料:https://www.cnblogs.com/nianming/p/7083964.html

Net core学习系列(九)——Net Core配置的更多相关文章

  1. 【.Net Core 学习系列】-- EF Core 实践(Code First)

    一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二解决方案: 新建项目: File --> New --> Project -->   ...

  2. 【.Net Core 学习系列】-- EF Core实践(DB First)

    一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ...

  3. EntityFramework Core 学习系列(一)Creating Model

    EntityFramework Core 学习系列(一)Creating Model Getting Started 使用Command Line 来添加 Package  dotnet add pa ...

  4. 源码学习系列之SpringBoot自动配置(篇一)

    源码学习系列之SpringBoot自动配置源码学习(篇一) ok,本博客尝试跟一下Springboot的自动配置源码,做一下笔记记录,自动配置是Springboot的一个很关键的特性,也容易被忽略的属 ...

  5. 源码学习系列之SpringBoot自动配置(篇二)

    源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...

  6. SpringBoot源码学习系列之SpringMVC自动配置

    目录 1.ContentNegotiatingViewResolver 2.静态资源 3.自动注册 Converter, GenericConverter, and Formatter beans. ...

  7. SpringBoot源码学习系列之异常处理自动配置

    SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...

  8. ASP.NET Core学习系列

    .NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET C ...

  9. Net core学习系列(一)——Net Core介绍

    一.什么是Net Core .NET Core是适用于 windows.linux 和 macos 操作系统的免费.开源托管的计算机软件框架,是微软开发的第一个官方版本,具有跨平台 (Windows. ...

随机推荐

  1. python基础--数据结构之字典

    字典 特点:无序,键唯一 目录 1.字典的创建 2. .setdefault 的使用 3.  字典中的查找 4.字典中的改 5. 字典中的删除 6. 打印字典的方法 7. 格式化字符串 8. 合并字符 ...

  2. DMA初识

    功能 DMA可以在CPU不干涉的情况下,进行数据的搬移.例如:通过DMA来获取摄像头输出的像素数据,而占用少量CPU资源. DMAMUX DMAMUX负责数据的路由:将触发源绑定到特定的DMA通道,当 ...

  3. Python学习日记(四十二) Mysql数据库篇 十

    前言 当我们自己去写SQL代码的时候有时候会因为不熟练会导致效率低,再之后要进行许多的优化,并且操作也较为繁琐.因此ORM框架就能够解决上面的问题,它能根据自身的一些规则来帮助开发者去生成SQL代码. ...

  4. Django下JWT的使用

    前言 JWT 是 json web token 的缩写, token的作用你应该已经了解,用于识别用户身份避免每次请求都需要验证 用来解决前后端分离时的用户身份验证 在传统的web项目中 我们会在fo ...

  5. Django rest framework 之版本

    一.通过 QueryParameterVersioning 获取版本 通过 QueryParameterVersioning 从 get 请求中获取版本信息: 1.新建 app,名为 api,Proj ...

  6. Ansible--项目实战

    Ansible项目实战lnmp 项目规划 通过ansible roles配置lnmp环境,nginx通过源码编译安装,php通过源码编译安装,mysql通过yum安装(mysql源码编译超级慢)支持系 ...

  7. PostMan变量与断言应用(对标Jmeter)

    常见的接口测试工具有PostMan/Jmeter/SoapUI,当然,也有一些公司为了更贴近自身的应用开发了一些小工具. 从功能上对比,Jmeter更为强大,既能做压测还能测接口,扩展性也比较好. B ...

  8. django项目中使用邮箱找回密码功能

    本文使用qq邮箱,需要登录邮箱,在设置-账户里面开启SMTP服务,要记下授权码 前端html {#找回密码的表单#} <form action="" method=" ...

  9. Vue基本用法

    在学习Vue的基本用法之前,我们先简单的了解一些es6的语法 let: 特点:1.局部作用域 2.不会存在变量提升 3.变量不能重复声明 const: 特点:1.局部作用域 2.不会存在变量提升 3. ...

  10. 如何把标准cout 输出到 自己写的web server

    如何把标准cout 输出到 自己写的web server 如何把标准cout 输出到 自己写的web server 如何把标准cout 输出到 自己写的web server cgi的功能? 有时间实现 ...