.netcore的配置介绍(一):IConfiguration

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2024.04.29北京

说到配置,绝大部分系统都会有配置,不需要配置的系统是非常少的,想想以前做.net开发时,我们常常将配置放到web.config中,然后使用ConfigurationManager去读取。

初次接触到.netcore的同学,在项目中看到有一个appsettings.json文件,确实这个appsettings.json文件是做配置用的,所以想当然的把它看做.net开发中的web.config一样,但是我们要清除,.netcore并不依赖appsettings.json文件中的配置。

一、原理

IConfigurationBuilder

IConfiguration

表示配置集合的接口,一般的,程序通过从DI获取IConfiguration接口的实例来获取配置

IConfigurationRoot

IConfigurationSection

IConfigurationSource

IConfigurationProvider

于是乎,将它们串接起来,流程就是这样的:

1、提供一个实现了IConfigurationProvider接口的配置提供类,它需要提供配置的读取以及更新等操作

2、提供一个IConfigurationSource接口实现类,它负责创建IConfigurationProvider。

3、创建一个IConfigurationBuilder配置建造者对象,然后将IConfigurationSource添加进配置构造者中,这里我们一般都采用IConfigurationBuilder的拓展方法来实现。

4、使用IConfigurationBuilder构造一个IConfigurationRoot,然后使用这个IConfigurationRoot去操作配置。

这是一般流程,而.netcore的配置是一个拓展模块,也就是说我们可以在控制台等其他项目中引用,只需要安装包:Microsoft.Extensions.Configuration

为了更好的说明,我们可以先看IConfiguration在WebHost中是怎么集成的,已.netcore3.1为例,它的Program是这样的:

publicstaticIHostBuilderCreateDefaultBuilder(string[]args){...builder.ConfigureAppConfiguration((hostingContext,config)=>{varenv=hostingContext.HostingEnvironment;config.AddJsonFile('appsettings.json',optional:true,reloadOnChange:true).AddJsonFile($'appsettings.{env.EnvironmentName}.json',optional:true,reloadOnChange:true);if(env.IsDevelopment()&&!string.IsNullOrEmpty(env.ApplicationName)){varappAssembly=Assembly.Load(newAssemblyName(env.ApplicationName));if(appAssembly!=null){config.AddUserSecrets(appAssembly,optional:true);}}config.AddEnvironmentVariables();if(args!=null){config.AddCommandLine(args);}})...}现在可以看出为什么appsettings.json是默认的配置文件了,ConfigureAppConfiguration方法就是对配置的构造过程,这里默认最多会加载5个配置源(也就是上面config.AddXXXXX()部分,后面具体介绍)。

官方在配置方法,提供了一些默认的配置源,它们都是通过IConfigurationBuilder的拓展方法来集成配置源,这也很好的给我们展示了如何添加自己的配置源。

官方默认提供的配置源有:

Json文件

NuGet安装包:Microsoft.Extensions.Configuration.Json

provider:提供json文件的一些信息及功能操作,比如所在结构目录,监听文件状态等等,默认默认值:newPhysicalFileProvider(AppContext.BaseDirectorystring.Empty)path:json文件路径optional:表示json文件是否是可选的,如果未false,那么当json文件不存在时则会抛出异常reloadOnChange:表示是否在文件内容修改后重新加载配置,如果未false,表示不重新加载stream:json文件流比如有一个json文件(注意文件位置):

{'Hello':{'Microsoft':{'Extensions':'Configuration'}}}configuration.json我们读取是这样的:

Ini文件

NuGet安装包:Microsoft.Extensions.Configuration.Ini

比如我们有一个ini文件(注意文件位置):

[SessionName1]KeyName11=value11KeyName12=value12[Section2Name]KeyName21=value21KeyName22=value22iniFile.ini我们读取是这样的:

Xml文件

NuGet安装包:Microsoft.Extensions.Configuration.Xml

比如我们有一个xml文件(注意文件位置):

value2value4value5xmlFile.xml我们读取是这样的:

注:配置的键不包含xml中的根路径

命令行参数

NuGet安装包:Microsoft.Extensions.Configuration.CommandLine

熟悉命令行的朋友知道,经常的,在执行一个命令时,可以携带一些参数,有些使用-或者--符号,有些则没有,同样的,dotnet命令在执行可以也可以携带一些运行时参数,.netcore可以将这些参数集成到IConfiguration中。

args:命令函参数switchMappings:映射转化,主要是将-开头和--开头的配置转换成执行的键名说明一下,参数必须满足一下规则:

1、必须以-、--、/作为前缀,其中--与/等价2、如果是以-为前缀的参数,则必须使用switchMappings做一层映射,否则将抛出FormatException,所以自定义的命令行参数建议采用--作为前缀3、参数名与参数值之间使用=或者空格分隔,建议使用=比如:

dotnetXXXX.dll-a=a--b=b/c=c--e1/d2结果是:

环境变量

NuGet安装包:Microsoft.Extensions.Configuration.EnvironmentVariables

例如:

注:IConfiguration中的键值会去掉环境变量名中的前缀,不如这里我的环境变量名是CommonProgramFiles,但是IConfiguration中的配置名是ProgramFiles

IConfiguration配置

这个很简单,只看个例子就可以了:

staticvoidMain(string[]args){//JsonConfigurationBuilderbuilder1=newConfigurationBuilder();builder1.AddJsonFile('configuration.json');varconfiguration1=builder1.Build();//IniConfigurationBuilderbuilder2=newConfigurationBuilder();builder2.AddIniFile('iniFile.ini');varconfiguration2=builder2.Build();//XmlConfigurationBuilderbuilder3=newConfigurationBuilder();builder3.AddXmlFile('xmlFile.xml');varconfiguration3=builder3.Build();//EnvironmentVariablesConfigurationBuilderbuilder4=newConfigurationBuilder();builder4.AddEnvironmentVariables('Common');varconfiguration4=builder4.Build();ConfigurationBuilderbuilder=newConfigurationBuilder();builder.AddConfiguration(configuration1);builder.AddConfiguration(configuration2);builder.AddConfiguration(configuration3);builder.AddConfiguration(configuration4);varconfiguration=builder.Build();varcollections=configuration.AsEnumerable();foreach(varitemincollections){Console.WriteLine('{0}={1}',item.Key,item.Value);}}ViewCode结果:

内存集合

这个也很简单,看例子就明白了了:

文件目录

NuGet安装包:Microsoft.Extensions.Configuration.KeyPerFile

需要注意的是,文件名中的双下划线(__)作为配置节点分隔符。

比如,我们有一些文件(在属性中输出类型设置成始终复制):

代码:

用户私密文件

NuGet安装包:Microsoft.Extensions.Configuration.UserSecrets

在集成时,会涉及到一个userSecretsId,其实它的本意是一个独一无二的目录名,一般设置成GUID,我们有两种方式使用它:

方式一:直接使用

builder.AddUserSecrets('userSecretsId');方式二:通过UserSecretsIdAttribute特性

首先给某个程序集添加UserSecretsIdAttribute特性,比如我这里就是启动项目设置:

[assembly:Microsoft.Extensions.Configuration.UserSecrets.UserSecretsId('userSecretsId')]然后使用启动项目的程序集去获取:

其实AddUserSecrets是基于Json文件配置的一个实现,换句话说,我们只需要在上面的隐私文件secrets.json中配置数据,就可以集成到IConfiguration中。

比如我在上面的目录下的secrets.json(C:\Users\Administrator\AppData\Roaming\Microsoft\UserSecrets\userSecretsId\secrets.json)内容如下:

{'Secret':{'Key1':{'Key2':'Value2'},'Key3':'Value3'}}secret.json我们这样访问:

Azure云

NuGet安装包:Microsoft.Extensions.Configuration.AzureKeyVault

三、IConfiguration使用

一般的,我们要获取IConfiguration或者IConfigurationRoot,都是结合DI容器来使用的,比如我们的Startup:

这里说的Key的特殊性,指的就是Key是有层级关系的,层级采用ConfigurationPath.KeyDelimiter字段标识来分隔,默认是冒号(:),不建议修改(采用反射可修改)。

2、当我们配置由改动,需要重新加载时,可以调用IConfigurationRoot的Reload方法重新加载配置

3、IConfiguration的GetSection方法可以获取某个节点信息,参数key是相对于当前节点的,其中IConfigurationSection中有三个属性:

Key:当前节点名,不包含路径Path:从根节点到当前节点的路径Value:当前节点数据4、IConfiguration的GetConnectionString方法获取的是当前节点下的ConnectionStrings节点下指定名称子节点的数据(源码):

publicstaticstringGetConnectionString(thisIConfigurationconfiguration,stringname){returnconfiguration.GetSection('ConnectionStrings')[name];}5、IConfiguration有两个重要的方法:Get和Bind。

Get方法将当前节点及其子节点的数据转换并存放到指定类型的实体对象的属性中,并返回改实体对象。

Bind方法接收一个实体对象,并将当前节点的及其字节点的数据保存到改实体对象的属性中。

举个简单的例子,比如我们在appsettings.json中有配置:

varsection=configuration.GetSection('Data');vardata1=section.Get();vardata2=newTestData();section.Bind(data2);这样一来,经过Get方法或者Bind方法,IConfiguration中的数据就放到我们熟悉的实体对象中去了,再也不用去做那些烦躁的字符串类型转换了!

四、总结

这一篇就先到这里吧,.netcore的配置还是很简单的,随便看看源码就能掌握。

THE END
1.coreWeb中使用appsettings.json配置文件的实例详解(ASP.NET)这篇文章主要给大家介绍了在asp.net core web中使用appsettings.json配置文件的方法,文中给出了详细的示例代码,需要的朋友可以参考学习,下面来一起看看吧。 前言 最近在研究把asp.net程序移植到linux上,正好.net core出来了,就进行了学习。 移植代码基本顺利,但是发现.net core中没有ConfigurationManager,无法读写配置...https://www.php.cn/mysql-tutorials-361060.html
2.Asp.NetCore读取appsettings.json配置文件Asp .Net Core 如何读取appsettings.json配置文件?最近也有学习到如何读取配置文件的,主要是通过 IConfiguration,以及在Program中初始化完成的。那么今天给大家介绍下具体如何读取配置文件的。 首先创建一个读取配置文件的公共类GetAppsetting,我们可以看下此时配置文件中的内容 ...https://www.jianshu.com/p/1c5afd795347
3.从appsettingsc#中读取json数组我的数组中有 appsettings.json"steps": [{ "name": "IMPORT", "enabled": true},{ "name": "IMPORT_XML", "enabled": true},{ "name": "COMPARE", "enabled": true},{ "test_name": "COMPARE_TABLE", "enabled": true}]在我的课堂上,我试图用 IConfigurationRoot _configurationRoot我试过了:...https://www.imooc.com/wenda/detail/648029
4..NET7WinFormsApp应用操作appsettings.json配置文件C/S框架网2、在VS内设置 appsettings.json文件属性 复制到输出目录:始终复制 生成操作:内容 3、定义一个全局类 C# Code: /// ///主程序AppSettings.Json配置类,作为全局类使用 /// publicclassGlobalAppSettings { publicstaticIConfiguration Configuration {get;set; } } //来源:...http://www.csframework.com/archive/1/arc-1-20230318-4640.htm
5..NET8中的.NETCore配置使用方法51Testing软件测试网从.NET Core 5开始,配置系统进行了重大改进,以支持多种配置源,如JSON、XML、环境变量、命令行参数,甚至自定义提供程序。这些配置源按定义的顺序进行处理,提供了一个统一和动态的配置系统。 在.NET Core及更高版本中,JSON文件(如appsettings.json)是配置的主要方式。以下是一个典型的appsettings.json文件示例: ...http://www.51testing.com/mobile/view.php?itemid=7803341
1.配置应用对于ASP.NET 和 ASP.NET Core 开发人员而言,在应用服务中设置应用设置类似于在 Web.config 或 appsettings.json 中的<appSettings>内进行设置,但应用服务中的值会替代 Web.config 或 appsettings.json 中的值。 可以在 Web.config 或 appsettings.json 中保留开发设置(例如本地 MySQL 密码),并在应用服务中安全地...https://azure.microsoft.com/zh-cn/documentation/articles/web-sites-configure/
2..NETCore使用IOptions优雅地读取配置注入依赖配置日志使用依赖注入(DI)模式,您可以轻松地将服务注入到控制台应用程序中。在上面的CreateHostBuilder方法中,您可以注册服务并指定它们的作用域(例如,单例、作用域或瞬态)。 三、配置日志 在appsettings.json中,我们配置了日志级别。要使这些设置生效,您需要配置日志提供程序,如Console或Debug。 https://blog.csdn.net/mss359681091/article/details/143783926
3.如何使用值数组读取appsettings.json在云计算领域,使用值数组读取appsettings.json文件是一种常见的配置文件读取方式,用于获取应用程序的配置信息。以下是完善且全面的答案: 概念: appsettings.json是一个JSON格式的配置文件,用于存储应用程序的配置信息,例如数据库连接字符串、日志级别、API密钥等。 分类: appsettings.json文件属于应用程序的配置文件,用于存...https://cloud.tencent.com/developer/information/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%80%BC%E6%95%B0%E7%BB%84%E8%AF%BB%E5%8F%96appsettings.json
4.八.netcore(.NET6)配置读取appsettings文件内容的通用功能加上通用性载入环境变量作用 在Wsk.Core.Package新项目下,增加Microsoft.Extensions.Configuration包: 在运行新项目下,设定appsettings.json特性为自始至终拷贝: 新创建一个文件夹名称Common,用以储放java工具新项目。而且新建项目:Wsk.Core.AppSettings,引入package包新项目,随后新创建一个载入环境变量的通用性类,叫App...https://www.dkewl.com/course/detail4648.html
5.ASP.NETCORE实现跨域实用技巧5.1、修改appsettings.json文件如下: { "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": { "url": "http://localhost:21632|http://localhost:24663" } } AllowedHosts里面设置的是允许跨域的ip,多个ip直接用“|”进行拼接,也可以用其他符合进行拼接。 https://m.jb51.net/article/240638.htm
6.8.数据校验Furion我们可以通过创建继承 IValidationMessageTypeProvider 验证消息提供器类型,或通过 appsettings.json 配置。[ValidationMessageType] 方式 using Furion.DataValidation;namespace Furion.Application{ [ValidationMessageType] public enum MyValidationMessageType { [ValidationMessage("必须是数值类型")] Numeric, [Validation...https://furion.net/docs/data-validation/
7.从公共类中的appsettings.json文件中获取值是指在ASP.NET Core应用程序中,通过读取appsettings.json配置文件来获取配置值。appsettings.json是一个JSON格式的文件,用于存储应用程序的配置信息。 在ASP.NET Core中,可以通过Configuration API来读取appsettings.json文件中的值。首先,需要在应用程序的Startup.cs文件中添加对Configuration的配置: 代码语言:txt 复制...https://cloud.tencent.com.cn/developer/information/%E4%BB%8E%E5%85%AC%E5%85%B1%E7%B1%BB%E4%B8%AD%E7%9A%84appsettings.json%E6%96%87%E4%BB%B6%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%80%BC
8.Furion配置极客教程什么是配置 简单来说,配置将系统应用可动态调配的选项放在统一地方管理,通过不同的配置让系统做出动态调整。 在ASP.NET Core应用程序启动时默认加载启动项目下的appsettings.json作为应用配置。同时还支持不同的运行环境加载对应的配置文件,如: Development:加载appsettings.Development.json ...http://www.jikejiaocheng.com/c/furion-config.html
9.webapiappsettings.json数据库连接51CTO博客编辑AppSettings.Json "ConnectionStrings": {"DefaultConnection": "Data Source=.;Initial Catalog=DataBaseName;User Id=UserName;Password=Password;"} 1. 2. 3. 引用Microsoft.Extensions.Configuration 创建 类 AppSettingsJson.cs publicstaticclassAppSettingsJson ...https://blog.51cto.com/u_15127628/3750553
10.c#ASP.NETCoreappsettings.jsonupdateincodeconfig[key] =value;varupdatedConfigJson = JsonSerializer.Serialize(config,newJsonSerializerOptions { WriteIndented =true}); File.WriteAllText("appsettings.json", updatedConfigJson); } ){if(appSettingsJsonFilePath ==null) { appSettingsJsonFilePath = System.IO.Path.Combine(System.AppContext.BaseDirectory...https://stackoverflow.com/questions/41653688/asp-net-core-appsettings-json-update-in-code