.NET中的配置系统支持丰富的配置源,包括文件(json,xml,ini等),注册表,环境变量,命令行,服务器等。还可以自定义配置源。可以跟踪配置的改变,可以按优先级覆盖。
安装包:Microsoft.Extensions.Configuration

读取本地Json配置

在项目中建一个json文件后,要把它的属性改成始终复制或者较新复制。
然后安装包Microsoft.Extensions.Configuration.Json

  1. {
  2. "name": "张三",
  3. "age": 18,
  4. "info": {
  5. "ids": [12,34,56],
  6. "subject": {
  7. "name": "语文",
  8. "page": 167
  9. }
  10. }
  11. }

基础用法

  1. static void Main(string[] args)
  2. {
  3. ConfigurationBuilder cb = new ConfigurationBuilder();
  4. //optional:文件是否可选,true没有文件也不报错,false没有这个文件直接抛出异常
  5. //reloadOnChange:true热加载
  6. cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);
  7. IConfigurationRoot config = cb.Build();
  8. string name = config["name"];
  9. Console.WriteLine(name);
  10. string page = config["info:subject:page"];
  11. Console.WriteLine(page);
  12. }

绑定读取配置

  1. 可以绑定一个类,自动完成配置的读取
  2. 安装:Microsoft.Extensions.Configuration.Binder
    1. public class MyConfig
    2. {
    3. public string Name { get; set; }
    4. public int Age { get; set; }
    5. public Info Info { get; set; }
    6. }
    7. public class Info
    8. {
    9. public int[] Ids { get; set; }
    10. public Subject Subject { get; set; }
    11. }
    12. public class Subject
    13. {
    14. public string Name { get; set; }
    15. public int Page { get; set; }
    16. }
    1. static void Main(string[] args)
    2. {
    3. ConfigurationBuilder cb = new ConfigurationBuilder();
    4. //optional:文件是否可选,true没有文件也不报错,false没有这个文件直接抛出异常
    5. //reloadOnChange:true热加载
    6. cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);
    7. IConfigurationRoot config = cb.Build();
    8. MyConfig mconfig = config.Get<MyConfig>();
    9. }

    Options依赖注入

    下载:Microsoft.Extensions.Options
    读取配置的时候,DI要声明IOptions,IOptionsMonitor,IOptionsSnapshot等类型。
  • IOptions:程序运行过程中,如果配置文件改变了,不会读取新的值
  • IOptionsMonitor:配置文件改变了,马上更改。
  • IOptionsSnapshot:在同一个范围内(比如ASP.NET一个请求中)保持一致。建议用这个。

    1. public class Controller
    2. {
    3. private readonly IOptionsSnapshot<MyConfig> config;
    4. public Controller(IOptionsSnapshot<MyConfig> config)
    5. {
    6. this.config = config;
    7. }
    8. public void test()
    9. {
    10. Console.WriteLine(config.Value.Name);
    11. Console.WriteLine(config.Value.Info.Subject.Name);
    12. }
    13. }
    1. static void Main(string[] args)
    2. {
    3. ConfigurationBuilder cb = new ConfigurationBuilder();
    4. cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);
    5. IConfigurationRoot config = cb.Build();
    6. ServiceCollection sc = new ServiceCollection();
    7. //意思是把MyConfig对象绑定到根节点config上面去了,这样的话,依赖注入会自动注入到MyConfig
    8. sc.AddOptions().Configure<MyConfig>(e => config.Bind(e));
    9. //如果配置内容很多,只想要其中一部分,
    10. //sc.AddOptions().Configure<Subject>(e => config.GetSection("info:subject").Bind(e));
    11. sc.AddScoped<Controller>();
    12. var controller = sc.BuildServiceProvider().GetRequiredService<Controller>();
    13. controller.test();
    14. }

    命令行方式配置

  1. 安装Microsoft.Extensions.Configuration.CommandLine
  2. configBuilder.AddCommandLine(args)
  3. 参数支持多种格式,比如server=127.0.0.1--server=127.0.0.1--server 127.0.0.1/server=127.0.0.1/server 127.0.0.1
  4. 格式不能混用
  5. 多个值之间用空格分割
  6. 对于环境变量,命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”。对于配置的名字需要采用“层级配置”,例如:a:b:c。对于数字这样的配置:a:b:c:0a:b:c:1

    1. static void Main(string[] args)
    2. {
    3. ConfigurationBuilder cb = new ConfigurationBuilder();
    4. cb.AddCommandLine(args);
    5. //cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);
    6. //后面步骤参考json部分
    7. }

    环境变量方式配置

  7. 安装Microsoft.Extensions.Configuration.EnvironmentVariables

  8. AddEnvironmentVariables()有两个重构,一个无参一个有一个prefix参数。无参数的是所有环境变量都加载进来。prefix参数,只加载带有这个前缀的环境变量。
    1. static void Main(string[] args)
    2. {
    3. ConfigurationBuilder cb = new ConfigurationBuilder();
    4. cb.AddEnvironmentVariables();
    5. //cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);
    6. //后面步骤参考json部分
    7. }

    多配置源覆盖优先级

    按照注册到ConfigurationBuilder的顺序,后注册的优先级高。同名的配置,用后注册的值。