• NET CORE Configuraion 使用详解


    相关配置

    1. "Microsoft.NET.Sdk">
    2. Exe
    3. netcoreapp3.1
    4. "Microsoft.Extensions.Configuration" Version="3.1.0" />
    5. "Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
    6. "Microsoft.Extensions.Configuration.Xml" Version="3.1.0" />
    7. "Microsoft.Extensions.Configuration.Ini" Version="3.1.0" />
    8. "Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.0" />
    9. "Microsoft.Extensions.Configuration.CommandLine" Version="3.1.0" />
    10. "Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
    11. "Microsoft.Extensions.Options" Version="3.1.0" />
    12. "Microsoft.Extensions.Configuration.Binder" Version="3.1.0" />
    13. "tsconfig.ini">
    14. PreserveNewest
    15. "tsconfig.json">
    16. Always
    17. "tsconfig.xml">
    18. PreserveNewest
    1. //tsconfig.dev.json
    2. {
    3. "ConnectionStrings": {
    4. "db1": "dev_xx1,xx",
    5. "db2": "dev_xx2,xx"
    6. },
    7. "t1": {
    8. "t2": {
    9. "t3": "dev_t1_t2_t3_val"
    10. }
    11. },
    12. "c1": {
    13. "c2": "dev_c1_c2_val"
    14. },
    15. "d1": {
    16. "d2": "dev_d1_d2_val"
    17. }
    18. }
    19. //tsconfig.json
    20. {
    21. "ConnectionStrings": {
    22. "db1": "xx1,xx",
    23. "db2": "xx2,xx"
    24. },
    25. "t1": {
    26. "t2": {
    27. "t3": "t1_t2_t3_val"
    28. }
    29. },
    30. "c1": {
    31. "c2": "c1_c2_val"
    32. },
    33. "d1": {
    34. "d2": "d1_d2_val"
    35. }
    36. }
    37. //tsconfig.ini
    38. MyKey="MyIniConfig.ini Value"
    39. [Position]
    40. Title="My INI Config title"
    41. Name="My INI Config name"
    42. [Logging:LogLevel]
    43. Default=Information
    44. Microsoft=Warning
    45. //tsconfig.xml
    46. "1.0" encoding="utf-8" ?>
    47. MyXMLFile Value
    48. Title <span class="hljs-keyword">from</span> MyXMLFile
    49. Name from MyXMLFile
    50. Information
    51. Warning

    读取环境变量

    引用:

    "Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.0" />
    1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    2. configBuilder.AddEnvironmentVariables(prefix: "test_");
    3. var config = configBuilder.Build();
    4. //读取test_p1环境变量的值,这里不需要【test_】前缀
    5. var p1 = config["p1"];
    6. 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文件的属性为【如果较新则复制】或【者始终复制】 

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

     运行结果:

    读取Ini配置

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

     运行结果:

     读取Xml配置

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

     运行结果:

     使用选项方式读取配置

    1. //注意:reloadOnChange 需要设置为true
    2. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    3. configBuilder.AddJsonFile("tsconfig.json", optional: false, reloadOnChange: true);
    4. IConfigurationRoot config = configBuilder.Build();
    5. //配置依赖注入
    6. IServiceCollection services = new ServiceCollection();
    7. services.AddOptions().Configure(c => config.GetSection("ConnectionStrings").Bind(c));
    8. services.AddTransient();
    9. using (var sp = services.BuildServiceProvider())
    10. {
    11. while (true)
    12. {
    13. using (var scope = sp.CreateScope())
    14. {
    15. var spScope = scope.ServiceProvider;
    16. var demo = spScope.GetRequiredService();
    17. demo.Test();
    18. }
    19. Console.WriteLine("可以改配置啦");
    20. Console.ReadKey();
    21. }
    22. }
    23. public class Demo
    24. {
    25. /*
    26. 1、IOptions在配置改变后,我们不能读到新的值,必须重启程序才可以读到新的值;
    27. 2、IOptionsMonitor在配置改变后,我们能读到新的值;
    28. 3、IOptionsSnapshot也是在配置改变后,我们能读到新的值,和IOptionsMonitor不同的是,在同一个范围内IOptionsMonitor会保持一致性。
    29. 通俗地说,在一个范围内,如果有A、B两处代码都读取了某个配置项,在运行A之后且在运行B之前,这个配置项改变了,那么如果我们用IOptionsMonitor读取配置,
    30. 在A处读到的将会是旧值,而在B处读到的是新值;如果我们用IOptionsSnapshot读取配置,在A处和B处读到的都是旧值,只有再次进入这个范围才会读到新值
    31. */
    32. //private readonly IOptions optDbSettings;
    33. //private readonly IOptionsMonitor optDbSettings;
    34. private readonly IOptionsSnapshot optDbSettings;
    35. public Demo(IOptionsSnapshot optDbSettings)
    36. {
    37. this.optDbSettings = optDbSettings;
    38. }
    39. public void Test()
    40. {
    41. var db = optDbSettings.Value;
    42. Console.WriteLine($"数据库:{db.db1},{db.db2}");
    43. }
    44. }

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

     命令行读取配置

    1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    2. configBuilder.AddCommandLine(args);
    3. IConfigurationRoot config = configBuilder.Build();
    4. /*
    5. 这里所用“:”号分层,对应json 格式为:
    6. {
    7. "t1":{
    8. "t2":{
    9. "t3":"t1_t2_t3_val"
    10. }
    11. }
    12. }
    13. */
    14. string server = config["t1:t2:t3"];
    15. Console.WriteLine($"value:{server}");

     运行结果:

     多源配置读取顺序分析

    配置顺序如下:

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

    1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    2. configBuilder
    3. .AddJsonFile("tsconfig.json", optional: false, reloadOnChange: true)
    4. .AddJsonFile("tsconfig.dev.json", optional: false, reloadOnChange: true)
    5. .AddEnvironmentVariables()
    6. .AddCommandLine(args);
    7. IConfigurationRoot config = configBuilder.Build();
    8. Console.WriteLine($"t1:t2:t3={config["t1:t2:t3"]}\r\n" +
    9. $"c1:c2={config["c1:c2"]}\r\n" +
    10. $"d1:d2={config["d1:d2"]}\r\n" +
    11. $"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 

  • 相关阅读:
    应用层协议 ——— HTTP协议
    系统架构设计师【补充知识】: 应用数学 (核心总结)
    基于Java纯净水商城配送系统设计与实现 开题报告
    Android 12 源码分析 —— 应用层 五(SystemUI的StatusBar类的启动过程和三个窗口的创建)
    Java:实现测试一个数是否为素数算法(附完整源码)
    FastAPI 学习之路(十三)Cookie 参数,Header参数
    MongoDB工具命令和用户认证
    【小尘送书-第八期】《小团队管理:如何轻松带出1+1>2的团队》
    【Sql】sql server数据库提示:执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb,错误:926。
    nrf52832 ADC的配置
  • 原文地址:https://blog.csdn.net/qq_32109957/article/details/127998326