• 重新整理 .net core 实践篇—————配置系统之军令状[七](配置文件)


    前言

    介绍一下配置系统中的配置文件,很多服务的配置都写在配置文件中,也是配置系统的大头。

    正文

    在asp .net core 提供了下面几种配置文件格式的读取方式。

    Microsoft.extensions.configuration.Ini
    
    Microsoft.extensions.configuration.Json
    
    Microsoft.extensions.configuration.NewtonsoftJson
    
    Microsoft.extensions.configuration.Xml
    
    Microsoft.extensions.configuration.UserSecrets
    

    这里演示json的,因为大多数的我们用的还是json。

    那么这里就要引入:Microsoft.extensions.configuration.Json 这个库。

    在根目录在创建appsettings.json 这个文件:

    里面如下:

    {
      "key1": "value1",
      "key2": "value2"
    }
    

    代码:

    IConfigurationBuilder builder = new ConfigurationBuilder();
    builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json");
    var configurationRoot = builder.Build();
    
    Console.WriteLine(configurationRoot["key1"]);
    Console.WriteLine(configurationRoot["key2"]);
    

    结果:

    如果说文件找不到,那么可能是下面这种情况,要设置复制过去。

    如果我们这个appsettings.json 不存在的话,那么会报错。

    当然我们可以设置如果没有这个appsettings.json 也不报错。

    我添加了一个不存在的配置文件appsettings_dev.json,那么会报错。

    IConfigurationBuilder builder = new ConfigurationBuilder();
    builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json");
    builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings_dev.json");
    var configurationRoot = builder.Build();
    
    Console.WriteLine(configurationRoot["key1"]);
    Console.WriteLine(configurationRoot["key2"]);
    

    报错如下:

    但是如果设置optional,那么是可选的,没有的话也不会报错。

     builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings_dev.json",optional:true);
    

    这里面同样AddJsonFile有一个属性reloadOnChange,这个属性设置是否当我们配置文件修改的时候,是否重新加载这个文件,默认为true。

    IConfigurationBuilder builder = new ConfigurationBuilder();
    builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true);
    var configurationRoot = builder.Build();
    
    Console.WriteLine(configurationRoot["key1"]);
    Console.WriteLine(configurationRoot["key2"]);
    
    Console.ReadKey();
    
    Console.WriteLine(configurationRoot["key1"]);
    Console.WriteLine(configurationRoot["key2"]);
    Console.ReadKey();
    

    修改后,按下enter键。

    修改内容如下:

    {
      "key1": "value1_change",
      "key2": "value2_change"
    }
    

    这里只演示了json文件,其实文件也一样。

    因为在前面中分析过ConfigurationRoot 这个类,知道它的索引,后面添加的文件配置会覆盖前面的,这里再贴一下。

    public string this[string key]
    {
    	get
    	{
    		for (int i = _providers.Count - 1; i >= 0; i--)
    		{
    			IConfigurationProvider provider = _providers[i];
    
    			if (provider.TryGet(key, out string value))
    			{
    				return value;
    			}
    		}
    
    		return null;
    	}
    	set
    	{
    		if (!_providers.Any())
    		{
    			throw new InvalidOperationException(SR.Error_NoSources);
    		}
    
    		foreach (IConfigurationProvider provider in _providers)
    		{
    			provider.Set(key, value);
    		}
    	}
    }
    

    是倒着获取的。

    下一节 配置系统之间谍[八](文件监听)

    以上只是个人整理,如有错误,望请指出,谢谢。

  • 相关阅读:
    带宽利用率提升50%,腾讯云联网架构方案解析
    重构实践:基于腾讯云Elasticsearch搭建QQ邮箱全文检索
    存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?
    秒级去重:ClickHouse在腾讯海量游戏营销活动分析中的应用
    降本提效,贝壳搜索推荐架构统一之路
    亿级用户,腾讯看点信息流推荐系统的架构挑战
    优秀程序员,如何提高架构能力?
    如何创建体元栅格?
    导出属性表字段结构
    去除镶嵌数据集中影像的黑边或白边
  • 原文地址:https://www.cnblogs.com/aoximin/p/14827246.html
Copyright © 2020-2023  润新知