找回密码
 立即注册
首页 业界区 业界 .NET Core中的配置Configuration实战

.NET Core中的配置Configuration实战

尤晓兰 前天 22:23
在前面的一篇文章中,我们对.NET 中的配置Configuration进行了一个详细的介绍,并且从整个源码的解读解释了配置中的核心接口以及主要的实现类。文章链接为:https://cshelloworld.com/home/detail/1912874623360438272。这篇文章我们主要来介绍每种配置如何使用。
基于内存的配置程序

基于内存的配置程序主要是在内存中维护了一个Key-Value键值对。
  1. static void MemoryConfig()
  2. {
  3.     List<KeyValuePair<string, string?>>? initialData = new List<KeyValuePair<string, string?>>();
  4.     initialData.Add(new KeyValuePair<string, string?>("name", "tom"));
  5.     IConfigurationRoot configuration = new ConfigurationBuilder()
  6.         .AddInMemoryCollection(initialData)
  7.         .Build();
  8.     Console.WriteLine("name:" + configuration["name"]);
  9. }
复制代码
调用如下:
  1. static void Main(string[] args)
  2. {
  3.     MemoryConfig();
  4. }
复制代码
基于现有的配置提供程序

这个配置提供程序用的相对较少,是微软在Microsoft.Extensions.Configuration类库中默认实现的一个配置提供程序,它可以把已经存在的配置IConfigurationRoot封装成一个配置提供程序。如果需要对针对现有配置快速Copy出一个新配置的话,可以使用这个配置提供程序。
  1. static void ChainedConfig()
  2. {
  3.     List<KeyValuePair<string, string?>>? initialData = new List<KeyValuePair<string, string?>>();
  4.     initialData.Add(new KeyValuePair<string, string?>("name", "tom"));
  5.         //初始化一个已有的配置
  6.     IConfigurationRoot configuration = new ConfigurationBuilder()
  7.         .AddInMemoryCollection(initialData)
  8.         .Build();
  9.         //基于已有的配置,重新生成一个一模一样的配置。
  10.     IConfigurationRoot newConfiguration = new ConfigurationBuilder()
  11.         .AddConfiguration(configuration)
  12.         .Build();
  13.     Console.WriteLine("name:" + configuration["name"]);
  14. }
复制代码
基于命令行的配置提供程序

基于命令行的配置程序,可以从控制台的命令行获取配置,这个配置提供程序可以快速将命令行参数分解成Key-Value键值对。而不需要我们自己手动对字符串进行处理(一般我们会按照空格拆分成数组,然后按照等号获取到键和值)
  1. //基于命令行的配置
  2. static void CommandLineConfig()
  3. {
  4.     IConfigurationRoot configuration = new ConfigurationBuilder()
  5.         .AddCommandLine(["name=tom","age=32"])
  6.         .Build();
  7.     Console.WriteLine("name:" + configuration["name"]);
复制代码
基于环境变量的配置提供程序

.NET可以读取环境变量中的Key-Value键值对,并且可以过滤到指定的前缀来筛选。下面代码中,程序将会加载环境变量中以TEST_开头的所有变量到配置中,我们在系统变量中,新增一个TEST_Name的变量,一定要重启一下计算机,否则新增的环境变量不会生效。然后我们的程序就可以读取到TEST_Name的变量值
  1. static void EnvironmentConfig()
  2. {
  3.     IConfigurationRoot configuration = new ConfigurationBuilder()
  4.         .AddEnvironmentVariables("Test_")
  5.         .Build();
  6.     Console.WriteLine("name:" + configuration["Name"]);
  7. }
复制代码
基于Json文件的配置提供程序

基于json的配置文件是我们最常用的配置文件格式了,.NET提供了标准的json配置提供程序,我们使用一下代码从一个app.json文件中加载配置,并且app.json被修改的时候,程序中的配置也会被更新。
  1. //基于Json文件的配置
  2. static void AddJsonFileConfig()
  3. {
  4.     IConfiguration configuration = new ConfigurationBuilder()
  5.         .AddJsonFile("app.json", optional: true, reloadOnChange: true)
  6.         .Build();
  7.     Console.WriteLine("name:" + configuration["name"]);
  8. }
复制代码
app.json的配置文件内容如下:
  1. {
  2.         "person":
  3.         {
  4.                 "name":"caoruipeng",
  5.                 "age":12,
  6.                 "school":"北京大学"
  7.         },
  8.         "name":"tom11"
  9. }
复制代码
基于XML文件的配置提供程序

基于XML的配置文件也是我们比较常用的配置文件格式了,.NET提供了标准的XML配置提供程序,我们使用一下代码从一个app.xml文件中加载配置,并且app.xml被修改的时候,程序中的配置也会被更新。
  1. //基于XML文件的配置
  2. static void AddXmlFileConfig()
  3. {
  4.     IConfiguration configuration = new ConfigurationBuilder()
  5.         .AddXmlFile("app.xml", optional: true, reloadOnChange: true)
  6.         .Build();
  7.     Console.WriteLine("name:" + configuration["name"]);
  8. }
复制代码
app.xml的配置文件内容如下:
  1. <?xml version="1.0" encoding="utf-8" standalone="yes"?>
  2. <config>
  3.         <name>tom</name>
  4.         21</age>
  5.         <school>beijing</school>
  6. </config>
复制代码
基于Ini文件的配置提供程序

Ini配置文件平时 我们使用的比较少,不过微软还是帮我们提供了基于Ini文件的配置提供程序。
  1. //基于INI文件的配置
  2. static void AddIniFileConfig()
  3. {
  4.     IConfiguration configuration = new ConfigurationBuilder()
  5.         .AddIniFile("app.ini", optional: true, reloadOnChange: true)
  6.         .Build();
  7.     Console.WriteLine("name:" + configuration["person:name"]);
  8. }
复制代码
app.ini文件的内容如下:
  1. [person]
  2. name=tom
  3. age=27
复制代码
自定义配置提供程序

官方提供的配置提供程序基本上可以满足我们的绝大部分需求,但是如果我们的配置存储在注册表中、存储在数据库中,这个时候官方的配置提供程序就无法满足我们的要求,我们就需要自定义配置提供程序。自定义配置提供程序很简单,主要包括两个类:自定义配置源IConfigurationSource、自定义配置提供程序ConfigurationProvider以及一个针对当前配置的扩展方法。下面代码,我们模拟一个基于数据库的配置提供程序,负责从数据库的配置表Config表中读取配置。当然案例代码,我们并不是真正的去读取数据库的表,大家可以自行完善代码。
  1. //自定义配置源
  2. public class DataBaseConfigurationSource : IConfigurationSource
  3. {
  4.     public IConfigurationProvider Build(IConfigurationBuilder builder)
  5.     {
  6.         return new DataBaseConfigurationProvider();
  7.     }
  8. }
  9. //自定义配置提供程序
  10. public class DataBaseConfigurationProvider : ConfigurationProvider
  11. {
  12.     public override void Load()
  13.     {
  14.         base.Load();
  15.         //读取数据库配置
  16.     }
  17. }
  18. //数据库配置程序的扩展方法
  19. public static class DataBaseConfigurationExtensions
  20. {
  21.     public static IConfigurationBuilder AddDb(this IConfigurationBuilder configurationBuilder)
  22.     {
  23.         configurationBuilder.Sources.Add(new DataBaseConfigurationSource());
  24.         return configurationBuilder;
  25.     }
  26. }
  27. //调用案例
  28. static void Main(string[] args)
  29. {
  30.     var builder = new ConfigurationBuilder()
  31.     .AddDb()
  32.     .Build();
  33.     var value = builder["key"];
  34. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册