MemoryConfigurationProvider使用内存中集合作为配置键值对。若要激活内存中集合配置,请在ConfigurationBuilder的实例上调用AddInMemoryCollection扩展方法。可以使用IEnumerable<KeyValuePair<String,String>> 初始化配置提供程序。构建主机时调用ConfigureAppConfiguration以指定应用程序的配置:
public class Program{public static readonly Dictionary<string, string> _dict =new Dictionary<string, string>{{"MemoryCollectionKey1", "value1"},{"MemoryCollectionKey2", "value2"}};public static void Main(string[] args){CreateWebHostBuilder(args).Build().Run();}public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.AddInMemoryCollection(_dict);}).UseStartup<Startup>();}
而通过启动应用程序时会看到如下配置信息:

ConfigurationBinder.GetValue<T>从具有指定键的配置中提取一个值,并可以将其转换为指定类型。如果未找到该键,则获取配置默认值。如上述示例中,配置两个value1、value2值,现在我们在键MemoryCollectionKey1配置中提取对应字符串值,如果找不到配置键MemoryCollectionKey1,则默认使用value3配置值,示例代码如下:
public Startup(IConfiguration configuration){Configuration = configuration;var config = Configuration.GetValue<string>("MemoryCollectionKey1", "value3");}
而通过启动应用程序时会看到如下配置信息:

ConfigurationBinder.GetValue找到定义string类型MemoryCollectionKey1键值并输出。如果我们把获取键名称更改为MemoryCollectionKey3,再来看看获取键值输出结果:

我们会看到当ConfigurationBinder.GetValue找不到定义string类型MemoryCollectionKey3键时,则输出默认值。
可以使用选项模式将文件配置绑定到相关实体类。配置值作为字符串返回,但调用Bind 可以绑定POCO对象。Bind在Microsoft.Extensions.Configuration.Binder包中,后者在 Microsoft.AspNetCore.App元包中。现在我们在CoreWeb/Models目录下新增一个叫starship.json文件,配置内容如下:
{"starship": {"name": "USS Enterprise","registry": "NCC-1701","class": "Constitution","length": 304.8,"commissioned": false},"trademark": "Paramount Pictures Corp. http://www.paramo**u*nt.com"}
然后再新增一个对应配置内容的实体模型(/Models/Starship.cs):
public class Starship{public string Name { get; set; }public string Registry { get; set; }public string Class { get; set; }public decimal Length { get; set; }public bool Commissioned { get; set; }}
构建主机时调用ConfigureAppConfiguration以指定应用程序的配置:
public static void Main(string[] args){CreateWebHostBuilder(args).Build().Run();}public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.SetBasePath(Directory.GetCurrentDirectory());config.AddJsonFile("starship.json", optional: true, reloadOnChange: true);}).UseStartup<Startup>();
示例应用程序调用GetSection方法获取json文件中starship键。通过Bind方法把starship键属性值绑定到Starship类的实例中:
var starship = new Starship();Configuration.GetSection("starship").Bind(starship);var _starship = starship;
当应用程序启动时会提供JSON文件配置内容:

通过第2小节我们学习到如何绑定配置文件内容映射到实例化实体类属性去,同样,配置文件内容也可以绑定到对象图去。现在我们在CoreWeb/Models目录下新增一个叫tvshow.xml文件,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?><configuration><tvshow><metadata><series>Dr. Who</series><title>The Sun Makers</title><airdate>11/26/1977</airdate><episodes>4</episodes></metadata><actors><names>Tom Baker, Louise Jameson, John Leeson</names></actors><legal>(c)1977 BBC https://www.b**bc*.co.uk/programmes/b006q2x0</legal></tvshow></configuration>
然后再新增一个对应配置内容的实体模型(/Models/TvShow.cs),其对象图包含Metadata和 Actors类:
public class TvShow{public Metadata Metadata { get; set; }public Actors Actors { get; set; }public string Legal { get; set; }}public class Metadata{public string Series { get; set; }public string Title { get; set; }public DateTime AirDate { get; set; }public int Episodes { get; set; }}public class Actors{public string Names { get; set; }}
构建主机时调用ConfigureAppConfiguration以指定应用程序的配置:config.AddXmlFile("tvshow.xml", optional: true, reloadOnChange: true);使用Bind方法将配置内容绑定到整个TvShow对象图。将绑定实例分配给用于呈现的属性:
public Startup(IConfiguration configuration){Configuration = configuration;var tvShow = new TvShow();Configuration.GetSection("tvshow").Bind(tvShow);var _tvShow = tvShow;}
当应用程序启动时会提供XML文件配置内容:

还有一种Bind方法可以将配置内容绑定到整个TvShow对象图:
public Startup(IConfiguration configuration){Configuration = configuration;var _tvShow = Configuration.GetSection("tvshow").Get<TvShow>();}
当应用程序启动时会提供XML文件配置内容:

Bind方法也支持把配置内容键中的数组绑定到对象类去。公开数字键段(:0:、:1:、... :{n}:)的任何数组格式都能够与POCO类数组进行绑定。使用内存配置提供应用程序在示例中加载这些键和值:
public class Program{public static Dictionary<string, string> arrayDict =new Dictionary<string, string>{{"array:entries:0", "value0"},{"array:entries:1", "value1"},{"array:entries:2", "value2"},{"array:entries:4", "value4"},{"array:entries:5", "value5"}};public static void Main(string[] args){CreateWebHostBuilder(args).Build().Run();}public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingContext, config) =>{config.SetBasePath(Directory.GetCurrentDirectory());config.AddInMemoryCollection(arrayDict);}).UseStartup<Startup>();}
因为配置绑定程序无法绑定null值,所以该数组跳过了索引#3的值。在示例应用程序中,POCO类可用于保存绑定的配置数据:
public class ArrayExample{public string[] Entries { get; set; }}
将配置数据绑定至对象:
public Startup(IConfiguration configuration){Configuration = configuration;var arrayExample = new ArrayExample();Configuration.GetSection("array").Bind(arrayExample);var _arrayExample = arrayExample;}
还可以使用ConfigurationBinder.Get<T>语法,从而产生更精简的代码:
public Startup(IConfiguration configuration){Configuration = configuration;var _arrayExample = _config.GetSection("array").Get<ArrayExample>();}
当应用程序启动时会提供内存配置内容:

若要访问RazorPages页或MVC视图中的配置设置,请为Microsoft.Extensions.Configuration命名空间添加using指令(C#参考:using指令)并将IConfiguration注入页面或视图。在Razor页面页中:
@page@model IndexModel@using Microsoft.Extensions.Configuration@inject IConfiguration Configuration<!DOCTYPE html><html lang="en"><head><title>Index Page</title></head><body><h1>Access configuration in a Razor Pages page</h1><p>Configuration value for 'key': @Configuration["key"]</p></body></html>
在MVC视图中:
@using Microsoft.Extensions.Configuration@inject IConfiguration Configuration<!DOCTYPE html><html lang="en"><head><title>Index View</title></head><body><h1>Access configuration in an MVC view</h1><p>Configuration value for 'key': @Configuration["key"]</p></body></html>