HTML5技术

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

字号+ 作者:H5之家 来源:H5之家 2017-06-28 10:00 我要评论( )

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

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

目前支持以下配置Provider:

如果现有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配置,后面会讲解所有读取它的方法

读取JSON配置

1.使用Key读取

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

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); 内存中配置

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 工作4年之后对人性、社会的疯言 - Arik lee

    工作4年之后对人性、社会的疯言 - Arik lee

    2015-12-25 14:29

  • 跟我一起写操作系统(一)——10分钟写个操作系统 - lucasysfeng

    跟我一起写操作系统(一)——10分钟写个操作系统 - lucasysfeng

    2015-09-30 11:00

网友点评
%