经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET Core Configuration 配置项知识点一网打尽!
来源:cnblogs  作者:雨太阳  时间:2024/6/5 9:26:52  对本文有异议

控制台项目中,演示示例

1.自定义 Dictionary Config  内存字典模式

  1. dotnet add package Microsoft.Extensions.Configuration
  2. IConfigurationBuilder builder = new ConfigurationBuilder();
  3. builder.AddInMemoryCollection(new Dictionary<string, string>()
  4. {
  5.     {"key1","v1"},
  6.     {"key2","v2"},
  7.     {"key3","v3"},
  8.     {"key4:key5","v4-v5"},
  9. }!);
  10. IConfigurationRoot configurationRoot = builder.Build();
  11. IConfiguration config = configurationRoot;
  12. Console.WriteLine(configurationRoot["key1"]);
  13. Console.WriteLine(configurationRoot["key2"]);
  14. IConfigurationSection section = config.GetSection("key4");
  15. Console.WriteLine(section["key5"]);
  16. Console.WriteLine(config["key4:key5"]);
  17. Console.WriteLine(configurationRoot["key4:key5"]);

2. 命令替换模式/提供程序

  1. //dotnet add package Microsoft.Extensions.Configuration.CommandLine
  2. var bulider = new ConfigurationBuilder();
  3. //bulider.AddCommandLine(ages);
  4. #region 命令替换模式/提供程序
  5. var mapper = new Dictionary<string, string>()
  6. {
  7.     {"-k1","CommandLineKey1" }
  8. };
  9. bulider.AddCommandLine(ages, mapper);
  10. //结果就会变为 LineKey:k3
  11. //通常用于 短命名,快捷命名
  12. #endregion
  13. var configurationRoot = bulider.Build();
  14. //属性--> 调试里面设置的启动参数
  15. Console.WriteLine($"LineKey:{configurationRoot["CommandLineKey1"]}");
  16. Console.WriteLine($"LineKey:{configurationRoot["CommandLineKey2"]}");
  17. Console.ReadKey();

3.环境变量提供应用程序

  1. //dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables
  2. var builder = new ConfigurationBuilder();
  3. builder.AddEnvironmentVariables();
  4. var configurationRoot = builder.Build();
  5. //属性--> 调试里面 设置的环境变量的 参数
  6. Console.WriteLine($"key1:{configurationRoot["key1"]}");
  7. #region 分层键
  8. Console.WriteLine($"key3:{configurationRoot.GetSection("select")["key3"]}");
  9. Console.WriteLine($"key4:{configurationRoot.GetSection("select:key3")["key4"]}");
  10. #endregion
  11. #region 前缀过滤
  12. builder.AddEnvironmentVariables("cy_");
  13. configurationRoot = builder.Build();
  14. Console.WriteLine($"cy key1:{configurationRoot["key1"]}");
  15. #endregion

4.文件配置提供程序

  1. //dotnet add package Microsoft.Extensions.Configuration.Ini
  2. //dotnet add package Microsoft.Extensions.Configuration.Json
  3. //dotnet add package Microsoft.Extensions.Configuration.NewtonsoftJosn
  4. //dotnet add package Microsoft.Extensions.Configuration.Xml
  5. //dotnet add package Microsoft.Extensions.Configuration.UserSecrets
  6. var builder = new ConfigurationBuilder();
  7. //optional:false 检测文件存不存在 默认false,当是true的时候,如果文件不存在则会报错~
  8. //reloadOnChange 是否读取文件变更
  9. builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
  10. builder.AddIniFile("appsettings.ini", optional: false, reloadOnChange: true);
  11. var configurationRoot = builder.Build();
  12. Console.WriteLine($"key1:{configurationRoot["key1"]}");
  13. Console.WriteLine($"key2:{configurationRoot["key2"]}");
  14. Console.WriteLine($"key3:{configurationRoot["key3"]}");
  15. Console.ReadKey();
  16. Console.WriteLine($"key1:{configurationRoot["key1"]}");
  17. Console.WriteLine($"key2:{configurationRoot["key2"]}");
  18. Console.WriteLine($"key3:{configurationRoot["key3"]}");
  19. var connectionString = configurationRoot["DatabaseSettings:ConnectionString"];
  20. var logLevel = configurationRoot["Logging:LogLevel"];
  21. var apiKey = configurationRoot["ApiSettings:ApiKey"];
  22. Console.WriteLine($"Connection String: {connectionString}");
  23. Console.WriteLine($"Log Level: {logLevel}");
  24. Console.WriteLine($"API Key: {apiKey}");
  25. Console.ReadKey();

5.配置变更监听

  1. var builder = new ConfigurationBuilder();
  2. builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
  3. var configurationRoot = builder.Build();
  4. IChangeToken changeToken = configurationRoot.GetReloadToken();
  5. //注意:Debug 模式下在 \bin\Debug\net8.0\的生成文件下去修改文件内容 才生效!!!
  6. ////只能获取一次变更!
  7. //changeToken.RegisterChangeCallback(state =>
  8. //{
  9. //    Console.WriteLine($"key1---->:{configurationRoot["key1"]}");
  10. //    Console.WriteLine($"key2---->:{configurationRoot["key2"]}");
  11. //    Console.WriteLine($"key3---->:{configurationRoot["key3"]}");
  12. //}, configurationRoot);
  13. //多次变更都能捕获到!
  14. ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () =>
  15. {
  16.     Console.WriteLine($"key1---->:{configurationRoot["key1"]}");
  17.     Console.WriteLine($"key2---->:{configurationRoot["key2"]}");
  18.     Console.WriteLine($"key3---->:{configurationRoot["key3"]}");
  19. });
  20. Console.ReadKey();

6.配置绑定

  1. //dotnet add package Microsoft.Extensions.Configuration.Binder
  2. //1.绑定已有对象
  3. //2.绑定私有属性
  4. var builder = new ConfigurationBuilder();
  5. builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
  6. var config = new AppSettingConfigModel()
  7. {
  8.     Key1 = "Key1",
  9.     Key2 = "Key2",
  10.     //Key4 = 4
  11. };
  12. var configurationRoot = builder.Build();
  13. configurationRoot.Bind(config); //以appsettings.json 的为准
  14. //多级设置
  15. configurationRoot.GetSection("OrderService").Bind(config, options =>
  16. {
  17.     //private 的私有属性,也可以赋值进去
  18.     options.BindNonPublicProperties = true;
  19. });
  20. Console.WriteLine($"Key2---->:{config.Key1}");
  21. Console.WriteLine($"Key2---->:{config.Key2}");
  22. Console.WriteLine($"Key4---->:{config.Key4}");

WebApi项目中,演示示例


WebApplicationConfig项目
  • Startup.cs 基础项

  1. public Startup(IConfiguration configuration)
  2. {
  3.     Configuration = configuration;
  4. }
  5. public IConfiguration Configuration { get; }

7.结合IOption<> 使用 选项框架

  1. //绑定整个 appsettings.json 到 AppSettings 类
  2. services.Configure<ConfigOptionsModel>(Configuration);
  3. private readonly IOptionsMonitor<ConfigOptionsModel> _options;
  4. //IOptionsSnapshot
  5. //IOptionsMonitor (单例的时候拿到变更项)
  6. public WeatherForecastController(IOptionsMonitor<ConfigOptionsModel> options)
  7. {
  8.     _options = options;
  9.     _options.OnChange(option =>
  10.     {
  11.         Console.WriteLine($"change-->{option.key1}");
  12.     });
  13. }
  14. [HttpGet]
  15. public string Get()
  16. {
  17.     Console.WriteLine(_options.CurrentValue.key1);
  18.     Console.WriteLine(_options.CurrentValue.key2);
  19.     Console.WriteLine(_options.CurrentValue.key3);
  20.     Console.WriteLine(_options.CurrentValue.key4);
  21.     return "1";
  22. }

8.为选项框架添加验证逻辑

  1. //为选项框架添加验证逻辑
  2. services.AddOptions<ConfigOptionsModel>().Configure(op =>
  3. {
  4.     Configuration.Bind(op);
  5. })
  6. ////属性设置验证 [Range(1,200)]
  7. //.ValidateDataAnnotations();
  8. //自定义属性验证 ConfigOptionsVaildateOptions
  9. .Services.AddSingleton<IValidateOptions<ConfigOptionsModel>, ConfigOptionsVaildateOptions>();
  10. ////自定义设置
  11. //.Validate(x =>
  12. //{
  13. //    return x.key4 <= 200;
  14. //}, "key4 不能大于200");
  15. //动态设置参数
  16. services.PostConfigure<ConfigOptionsModel>(option =>
  17. {
  18.     option.key1 += "===>PostConfigure";
  19. });

namespace WebApplicationConfig 文件

  1. public class ConfigOptionsModel
  2. {
  3.     public string key1 { get; set; }
  4.     public string key2 { get; set; }
  5.     public string key3 { get; set; }
  6.     [Range(1,500)]
  7.     public int key4 { get; set; }
  8. }
  9. public class ConfigOptionsVaildateOptions : IValidateOptions<ConfigOptionsModel>
  10. {
  11.     public ValidateOptionsResult Validate(string name, ConfigOptionsModel options)
  12.     {
  13.         if (options.key4 > 300) 
  14.         {
  15.             throw new ValidationException("key4 不能大于300");
  16.         }
  17.         return ValidateOptionsResult.Success;
  18.     }
  19. }

参考项目地址

  • ? https://github.com/goodluckily/ConsoleAppConfig

  • ? https://github.com/goodluckily/WebApplicationConfig

 

END 欢迎关注 "ShareFlow" 公众号

原文链接:https://www.cnblogs.com/goodluckily/p/18230478

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号