前言
介绍一下配置系统中的配置文件,很多服务的配置都写在配置文件中,也是配置系统的大头。
正文
在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);
}
}
}
是倒着获取的。
结
下一节 配置系统之间谍[八](文件监听)
以上只是个人整理,如有错误,望请指出,谢谢。