.NET Core中的配置系统

传统配置方式

  • 文件Web.config 进行配置。
  • ConfigurationManager类配置。

.NET配置系统中支持配置方式

  • 文件配置(json、xml、ini等)
  • 注册表
  • 环境变量
  • 命令行
  • 自定义配置源

Json文件配置方式

实现步骤:

  1. 创建一个json文件,把文件设置 为"如果较新则复制 ",这样编译后的文件会复制一份到bin目录下。

    javascript 复制代码
    {
        "name": "wangxiaohua",
        "exclude": [
            "**/bin",
            "**/bower_components",
            "**/jspm_packages",
            "**/node_modules",
            "**/obj",
            "**/platforms"
        ],
     "proxy":{
         "key": "value",
         "age": 88
     }
    }
  2. Nuget安装

    1. Microsoft.Extensions.Configuration 配置框架基础包
    2. Microsoft.Extensions.Configuration.Json 读取json配置文件包
  3. 编写代码读取配置。

    cs 复制代码
    namespace ConsoleApp1
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                //创建配置构造器
                ConfigurationBuilder builder = new ConfigurationBuilder();
    
                //添加需要被读取的json文件,
                //optional参数是文件不存在是否报错
                //reloadOnChange配置文件被更新时是否重新加载配置文件
                builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
    
                //获得配置层级的根层级
                IConfigurationRoot confRoot = builder.Build();
    
               string name = confRoot["name"];
                Console.WriteLine($"name={name}");
    
                string value =confRoot.GetSection("proxy:key").Value;
                Console.WriteLine($"value={value}");
    
    
                Console.ReadKey();
    
            }
        }
    }

    对象映射方式读取json文件

例如:

将配置内容映射成对象

javascript 复制代码
{
"name":"wangwu",
"age":99,
"proxy":{"address":"192.168.0.1","port":"80"}


}

创建一个类文件,属性和配置文件中key相对应

cs 复制代码
 //把整个配置文件映射成一个对象
class Config { 
     public string Name { get; set; }
     public int Age { get; set; }
     public Proxy Proxy { get; set; }
 }


//将proxy中的内容映射成一个类
 class Proxy { 
     public string Address { get; set; }
     public string Port { get; set; }
 }

读取映射类,读取之前需要先安装NuGet包:Microsoft.Extensions.Configuration.Binder

cs 复制代码
namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //创建配置构造器
            ConfigurationBuilder builder = new ConfigurationBuilder();

            //添加需要被读取的json文件,
            //optional参数是文件不存在是否报错
            //reloadOnChange配置文件被更新时是否重新加载配置文件
            builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);

            //获得配置层级的根层级
            IConfigurationRoot confRoot = builder.Build();

                Config config =confRoot.Get<Config>();
                            //获取配置文件中name的值
                         Console.WriteLine(config.Name);

                            //获取配置文件中port的值
                         Console.WriteLine(config.Proxy.port)
                    
              //读取指定对象
                Porxy  porxy =confRoot.GetSection("porxy").Get<Porxy>();

                
        }
    }
}

使用选项方式读取配置文件(推荐)

首先需要安装Nuget包:

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.Json

Microsoft.Extensions.Configuration.Binder

Microsoft.Extensions.Options

然后再读取配置文件时候,需要使用到DI注入IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>类型。

IOptions<T>不会读取到更新的值

IOptionsSnapshot<T> 在一定的范围内读取的是原来的值

IOptionsMonitor<T> 立即读取到更新值

创建一个类文件:在这个文件中注入IOptionsSnapshot<T> 接口

cs 复制代码
 class OptionsConfig
{
    //声明IOptionsSnapshot 
    private readonly IOptionsSnapshot<Config> options;

    //使用构造方法方式进行注入
   public OptionsConfig(IOptionsSnapshot<Config> options) { 

        this.options = options;

    }

    
    public void Test() {
        Config config =options.Value;
        Console.WriteLine(config.Name);
    }

}

在使用读取配置文件

cs 复制代码
    static void Main(string[] args)
    {
        //创建DI容器对象
        ServiceCollection services = new ServiceCollection();

        //将OptionsConfig类注册到容器对象中
        services.AddScoped<OptionsConfig>();


        //创建配置构造器
        ConfigurationBuilder builder = new ConfigurationBuilder();

        //添加需要被读取的json文件,
        //optional参数是文件不存在是否报错
        //reloadOnChange配置文件被更新时是否重新加载配置文件
        builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);

        //获得配置层级的根层级
        IConfigurationRoot confRoot = builder.Build();
       

        //添加选项所需的服务,把文件和节点进行绑定
        // services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));
        //使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包
        IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));


        using (var sp =services.BuildServiceProvider()) {

            OptionsConfig config = sp.GetRequiredService<OptionsConfig>();
            config.Test();

        }



            Console.ReadKey();

    }

命令行方式进行配置:

需要安装包:Microsoft.Extensions.Configuration.CommandLine

cs 复制代码
    static void Main(string[] args)
    {
        //创建DI容器对象
        ServiceCollection services = new ServiceCollection();

        //将OptionsConfig类注册到容器对象中
        services.AddScoped<OptionsConfig>();


        //创建配置构造器
        ConfigurationBuilder builder = new ConfigurationBuilder();

      
        //---------------把原来添加读取JSON文件更换成命令行------------------
            builder.AddCommandLine(args); 
        
        //----------------------------------




        //获得配置层级的根层级
        IConfigurationRoot confRoot = builder.Build();
       

        //添加选项所需的服务,把文件和节点进行绑定
        // services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));
        //使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包
        IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));


        using (var sp =services.BuildServiceProvider()) {

            OptionsConfig config = sp.GetRequiredService<OptionsConfig>();
            config.Test();

        }



            Console.ReadKey();

    }

使用时候就是在cmd窗口中使用,应用程序加参数方式。

调试时可以直接在IDE进行传递参数:

在项目上右键鼠标选择"属性"

在选择"调试" --》"启动配置文件"

直接在命令行参数中填写需要传递的参数

参数的扁平化配置(扁平就是把每个参数都展开)

如果在命令行中传递的不是简单是键值对,是比较复杂的对象或数组

对象属性传参格式:

类名:属性名=值

对象的数组传参格式:

类名:属性名:数组下标 = 值

cs 复制代码
 class Proxy { 
     public string Address { get; set; }
     public string Port { get; set; }

       public int[] Ids {get;set;}
 }

比如上面的模型类是一个对象,对象中还有数组,在命令行中就需要使用到扁平化传参数。

传递参数应该是:

环境变量读取参数配置

1.首先也是需要安装Nuget包:

Microsoft.Extensions.Configuration.EnvironmentVariables

2.然后调用环境变量参数函数:configurationBuilder.AddEnvironmentVariables(),这个函数有无参数和有参数prefix参数重载版本。建议调用prefix版本(带前缀区别环境变量),加载参数时候会忽略prefix参数不会和系统配置环境变量冲突。

cs 复制代码
    static void Main(string[] args)
    {
        //创建DI容器对象
        ServiceCollection services = new ServiceCollection();

        //将OptionsConfig类注册到容器对象中
        services.AddScoped<OptionsConfig>();


        //创建配置构造器
        ConfigurationBuilder builder = new ConfigurationBuilder();

      
        //---------------把原来添加读取JSON文件更换成环境变量配置方式------------------
        //----------------------------环境变量配置方式-------------------------------

             builder.AddEnvironmentVariables();
        
        //----------------------------------




        //获得配置层级的根层级
        IConfigurationRoot confRoot = builder.Build();
       

        //添加选项所需的服务,把文件和节点进行绑定
        // services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));
        //使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包
        IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));


        using (var sp =services.BuildServiceProvider()) {

            OptionsConfig config = sp.GetRequiredService<OptionsConfig>();
            config.Test();

        }



            Console.ReadKey();

    }

3.设置环境变量键值对:

ide调试参数配置:

部署环境,需要在 "我的电脑" --》属性--》高级--》环境变量中进行配置

开发自定义配置步骤

1.自己开发类需要实现IConfigurationProvider接口

实现 IConfigurationProvider的类有 ConfigurationProvider 和FileConfigurationProvider,重写Load方法,把数据扁平化设置到Data属性中即可。

2.在开发一个实现IConfigurationSource接口的类。读取文件可以继承类 FileConfigurationSource在重写Build方法中返回上面的ConfigurationProvider对象。

3.然后把ConfigurationSource对象加入到IConfigurationBuilder中 ,configurationBuilder.Add(new ConfigurationSource())