1. 内存配置
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>();
- }
而通过启动应用程序时会看到如下配置信息:
1.1GetValue
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 键时, 则输出默认值.
2. 绑定到实体类
可以使用选项模式将文件配置绑定到相关实体类. 配置值作为字符串返回, 但调用 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.paramount.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 文件配置内容:
3. 绑定至对象图
通过第 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.bbc.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 文件配置内容:
4. 将数组绑定至类
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>();
- }
当应用程序启动时会提供内存配置内容:
5. 在 Razor Pages 页或 MVC 视图中访问配置
若要访问 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>
参考文献:
ASP.NET Core 中的配置
来源: https://www.cnblogs.com/wzk153/p/11264554.html