(12)ASP.NET Core 中的配置二(Configuration)
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>//</airdate>
- <episodes></episodes>
- </metadata>
- <actors>
- <names>Tom Baker, Louise Jameson, John Leeson</names>
- </actors>
- <legal>(c) 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 中的配置
(12)ASP.NET Core 中的配置二(Configuration)的更多相关文章
- 3、带你一步一步学习ASP.NET Core中的配置之Configuration
如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了.那么你肯 ...
- (11)ASP.NET Core 中的配置一(Configuration)
1.前言 ASP.NET Core在应用程序上引入Microsoft.Extensions.Configuration配置,可以支持多种方式配置,包括命令行配置.环境变量配置.文件配置.内存配置,自定 ...
- 聊聊ASP.NET Core中的配置
作为软件开发人员,我们当然喜欢一些可配置选项,尤其是当它允许我们改变应用程序的行为而无需修改或编译我们的应用程序时.无论你是使用新的还是旧的.NET时,可能希望利用json文件的配置.在这篇文章中, ...
- 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...
- ASP.NET Core 中的配置
目录 以键-值对的形式读取配置 多环境配置 读取结构化的配置数据 参考 .NET Core 定义配置的方式不同于之前 NET 版本,之前是依赖于 System.Configuration 的 app. ...
- ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置
前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...
- ASP.NET Core中的配置
配置 参考文件点击跳转 配置来源 命令行参数 自定义提供程序 目录文件 环境变量 内存中的.NET 对象 文件 默认配置 CreateDefaultBuilder方法提供有默认配置,在这个方法中会接收 ...
- IdentityServer4在Asp.Net Core中的应用(二)
继续上次授权的内容,客户端模式后我们再说以下密码模式,先回顾下密码模式的流程: 我们还是使用上次的代码,在那基础上修改,在IdentityServer4里面有一个IdentityServer4.Tes ...
- (13)ASP.NET Core 中的选项模式(Options)
1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸.在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类.绑定至对 ...
随机推荐
- Mount挂载/data时出现mount: /data is busy 如何解决?
1.df -h查看下挂载点/data是否正在使用,有时候会存在挂载了,但df -h不会显示出来,这时候 grep “/data” /proc/mounts 来进行查看 2.当确认挂载点/data正在使 ...
- 01-pymysql模块的安装
1.从github 下载pymysql 安装包,下载地址为:https://github.com/PyMySQL/PyMySQL 2.解压下载文件,不用打开python交互界面,cd到解压文件所在目录 ...
- 【mysql5.7】远程无法连接设置
版本5.7 系统:ubuntu16.04 配置文件位置(apt安装): 1.链接设置 注释掉在/etc/mysql/mysql.conf.d/mysqld.cnf里面的bind-address = 1 ...
- idea+mvc项目转换小记
经过大家协商,决定还是紧跟时代潮流,把项目转到idea下,并且重新组织项目结构.项目环境原本为myeclipse+maven+springMVC,由于本人提议的boot+cloud变化太大,成本巨大, ...
- Spring Boot2(六):使用Spring Boot整合AOP面向切面编程
一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop aop全称Aspec ...
- 我竟然不再抗拒 Java 的类加载机制了
很长一段时间里,我对 Java 的类加载机制都非常的抗拒,因为我觉得太难理解了.但为了成为一名优秀的 Java 工程师,我决定硬着头皮研究一下. 01.字节码 在聊 Java 类加载机制之前,需要先了 ...
- CentOS 网络互通情况下把一个Linux服务器的文件发送到另一个服务器
scp -r 文件名/目录名 root@192.168.2.144:/home/hsw -r 发送目录使用,表示把该目录下的所有子目录以及文件发送过去
- 关于网页授权access_token和普通access_token的区别
关于网页授权access_token和普通access_token的区别 1.微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授 ...
- SQL Server Form子查询、链接查询
所用数据表:用户,钱包,订单 一.from子查询 --查询钱包里金额大于30000 and User_ID = Users.ID) ) 二.链接查询 内连接(inner join)外连接(left/r ...
- CDQZ集训DAY6 日记
又炸了. 早上起来其他竞赛生也走了,食堂做饭做的挺潦草,但为什么四川烧麦的馅是米啊??!! 起来看题总觉得都似曾相识.第一题打完40分暴力后想拿莫队搞到70分,但发现能想到的莫队维护都是nsqrt(n ...