NET CORE Configuraion 使用详解
创始人
2024-04-11 20:15:06
0

相关配置

Exenetcoreapp3.1PreserveNewestAlwaysPreserveNewest
//tsconfig.dev.json
{"ConnectionStrings": {"db1": "dev_xx1,xx","db2": "dev_xx2,xx"},"t1": {"t2": {"t3": "dev_t1_t2_t3_val"}},"c1": {"c2": "dev_c1_c2_val"},"d1": {"d2": "dev_d1_d2_val"}
}//tsconfig.json
{"ConnectionStrings": {"db1": "xx1,xx","db2": "xx2,xx"},"t1": {"t2": {"t3": "t1_t2_t3_val"}},"c1": {"c2": "c1_c2_val"},"d1": {"d2": "d1_d2_val"}
}//tsconfig.ini
MyKey="MyIniConfig.ini Value"[Position]
Title="My INI Config title"
Name="My INI Config name"[Logging:LogLevel]
Default=Information
Microsoft=Warning//tsconfig.xml

MyXMLFile ValueTitle from  MyXMLFileName from MyXMLFileInformationWarning

读取环境变量

引用:

ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddEnvironmentVariables(prefix: "test_");
var config = configBuilder.Build();
//读取test_p1环境变量的值,这里不需要【test_】前缀
var p1 = config["p1"];
Console.WriteLine($"test_1:{p1}");

运行结果 :

 

示例代码说明:

1、test_ 前缀的环境变量会被加载到程序,如果没有前缀会加载所有环境变量。
2、需要注意的是,在读取环境变量时不需要前缀。
3、DOTNET_ 和 ASPNETCORE_ 前缀会由 ASP.NET Core 用于主机和应用配置,但不用于用户配置,详细介绍可以参考:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-7.0

读取配置文件 

注意:需要设置tsconfig.json文件的属性为【如果较新则复制】或【者始终复制】 

ConfigurationBuilder configBuilder = new ConfigurationBuilder();
/*optional:参数表示这个文件是否可选,如果它的值为true,则当配置文件不存在的时候,程序不会报错;如果它的值为false,当配置文件不存在的时候,程序会报错eloadOnChange:参数表示如果文件修改了,是否重新加载配置*/
configBuilder.AddJsonFile("tsconfig.json", optional: false, reloadOnChange: false);
IConfigurationRoot config = configBuilder.Build();//获取连接字符串,读取“ConnectionStrings”节点下的名为【db2】的连接字符串值
var conn = config.GetConnectionString("db2");
Console.WriteLine($"conn:{conn}");string value = config.GetSection("t1:t2:t3").Value;
Console.WriteLine($"value={value}");

 运行结果:

读取Ini配置

ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddEnvironmentVariables(prefix: "test_");
configBuilder.AddIniFile("tsconfig.ini", optional: false, reloadOnChange: false);
IConfigurationRoot config = configBuilder.Build();
var myKeyValue = config["MyKey"];
var title = config["Position:Title"];
var positionName = config["Position:Name"];
var defaultLogLevel = config["Logging:LogLevel:Default"];
Console.WriteLine($"MyKey value: {myKeyValue} \n" +$"Title: {title} \n" +$"Name: {positionName} \n" +$"Default Log Level: {defaultLogLevel}");

 运行结果:

 读取Xml配置

ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddEnvironmentVariables(prefix: "test_");
configBuilder.AddXmlFile("tsconfig.xml", optional: false, reloadOnChange: false);
IConfigurationRoot config = configBuilder.Build();
var myKeyValue = config["MyKey"];
var title = config["Position:Title"];
var positionName = config["Position:Name"];
var defaultLogLevel = config["Logging:LogLevel:Default"];
Console.WriteLine($"MyKey value: {myKeyValue} \n" +$"Title: {title} \n" +$"Name: {positionName} \n" +$"Default Log Level: {defaultLogLevel}");

 运行结果:

 使用选项方式读取配置

//注意:reloadOnChange 需要设置为true
ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("tsconfig.json", optional: false, reloadOnChange: true);
IConfigurationRoot config = configBuilder.Build();
//配置依赖注入
IServiceCollection services = new ServiceCollection();
services.AddOptions().Configure(c => config.GetSection("ConnectionStrings").Bind(c));
services.AddTransient();
using (var sp = services.BuildServiceProvider())
{while (true){using (var scope = sp.CreateScope()){var spScope = scope.ServiceProvider;var demo = spScope.GetRequiredService();demo.Test();}Console.WriteLine("可以改配置啦");Console.ReadKey();}
}public class Demo
{/*1、IOptions在配置改变后,我们不能读到新的值,必须重启程序才可以读到新的值;2、IOptionsMonitor在配置改变后,我们能读到新的值;3、IOptionsSnapshot也是在配置改变后,我们能读到新的值,和IOptionsMonitor不同的是,在同一个范围内IOptionsMonitor会保持一致性。通俗地说,在一个范围内,如果有A、B两处代码都读取了某个配置项,在运行A之后且在运行B之前,这个配置项改变了,那么如果我们用IOptionsMonitor读取配置,在A处读到的将会是旧值,而在B处读到的是新值;如果我们用IOptionsSnapshot读取配置,在A处和B处读到的都是旧值,只有再次进入这个范围才会读到新值*///private readonly IOptions optDbSettings;//private readonly IOptionsMonitor optDbSettings;private readonly IOptionsSnapshot optDbSettings;public Demo(IOptionsSnapshot optDbSettings){this.optDbSettings = optDbSettings;}public void Test(){var db = optDbSettings.Value;Console.WriteLine($"数据库:{db.db1},{db.db2}");}
}

 第一次运行和修改配置文件后运行结果:

 命令行读取配置

ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddCommandLine(args);
IConfigurationRoot config = configBuilder.Build();
/*这里所用“:”号分层,对应json 格式为:{"t1":{"t2":{"t3":"t1_t2_t3_val"}}}*/
string server = config["t1:t2:t3"];
Console.WriteLine($"value:{server}");

 运行结果:

 多源配置读取顺序分析

配置顺序如下:

 1、配置文件
 2、环境变量
 3、命令行            
 结论:后添加的配置提供程序中的配置覆盖会之前的配置

ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("tsconfig.json", optional: false, reloadOnChange: true).AddJsonFile("tsconfig.dev.json", optional: false, reloadOnChange: true).AddEnvironmentVariables().AddCommandLine(args);IConfigurationRoot config = configBuilder.Build();
Console.WriteLine($"t1:t2:t3={config["t1:t2:t3"]}\r\n" +$"c1:c2={config["c1:c2"]}\r\n" +$"d1:d2={config["d1:d2"]}\r\n" +$"ConnectionStrings:db1={config["ConnectionStrings:db1"]}");

运行结果: 

红色字体代表最终的输出结果: 

添加顺序ConnectionStrings:db1t1:t2:t3c1:c2d1:d2
dev.json配置文件dev_xx1,xxdev_t1_t2_t3_valdev_c1_c2_valdev_d1_d2_val
json配置文件xx1,xxt1_t2_t3_valc1_c2_vald1_d2_val
环境变量s_c1_c2_vals_d1_d2_val
命令行m_t1_t2_t3_valm_d1_d2_val

参考:

 【.NET Core框架】配置(Configuration) - .Neterr - 博客园

ASP.NET Core 中的配置 | Microsoft Learn 

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...