目录索引
简介
我们在 读取配置文件(一) appsettings.json 中介绍了,如何读取appsettings.json.
但随之产生了问题:我们使用的是在 Startup.cs 中(如下图)来实现配置读取,有两个问题 ① 我们如果定义N种配置,是否要再这里添加N条这样的配置 ; ② 如果我们的配置不想写在appsettings.json中呢
解决问题
带着上面的两个问题,我们首先来添加一个配置文件 siteconfig.json
{
"SiteBaseConfig": {
//文件上传路径
"FileUpPath": "/upload/",
//是否启用单用户登录
"IsSingleLogin": "True",
//允许上传的文件格式
"AttachExtension": "gif,jpg,jpeg,png,bmp,rar,zip,doc,docx,xls,xlsx,ppt,pptx,txt,flv,apk,mp4,mpg,ts,mpeg,mp3,bak,pdf",
//图片上传最大值KB
"AttachImagesize": 12400
}
}
我们在读取文件配置(一)中的配置类 ApplicationConfiguration
1 public class ApplicationConfiguration 2 { 3 #region 属性成员 4 5 /// <summary> 6 /// 文件上传路径 7 /// </summary> 8 public string FileUpPath { get; set; } 9 /// <summary> 10 /// 是否启用单用户登录 11 /// </summary> 12 public bool IsSingleLogin { get; set; } 13 /// <summary> 14 /// 允许上传的文件格式 15 /// </summary> 16 public string AttachExtension { get; set; } 17 /// <summary> 18 /// 图片上传最大值KB 19 /// </summary> 20 public int AttachImagesize { get; set; } 21 #endregion 22 }
在 project.json 的 buildOptions 添加 "copyToOutput": "siteconfig.json",让该文件在编译的时候自动拷贝到输出目录下(默认为bin目录):
修改 读取文件配置(一) 的领域层 AppConfigurtaionServices
public class AppConfigurtaionServices
{
public T GetAppSettings<T>(string key)where T:class,new()
{
IConfiguration config = new ConfigurationBuilder()
.Add(new JsonConfigurationSource { Path= "siteconfig.json", ReloadOnChange=true })
.Build();
var appconfig= new ServiceCollection()
.AddOptions()
.Configure<T>(config.GetSection(key))
.BuildServiceProvider()
.GetService<IOptions<T>>()
.Value;
return appconfig;
}
}
说明:我们首先创建了一个ConfigurationBuilder对象,并在它上面注册了一个JsonConfigurationSource。在创建这个JsonConfigurationSource对象的时候,除了指定配置文件(“siteconfig.json”)的路径之外,我们还将它的 ReloadOnChange 属性设置为True。这个ReloadOnChange属性的含义就是当原始配置文件的内容发生改变的时候是否需要重新加载配置。
这时候我们会发现 Configure<T>(config.GetSection(key)) 报错:
我查看了我们之前在Startup中的 services.Configure<T>() 发现,这个里面的参数是有两个重载的 一个是 IConfiguration 一个是 System.Action<T>,那么为什么这里重载不出来了呢?
十分不解,最后发现是少了扩展类 Microsoft.Extensions.Options.ConfigurationExtensions
我们通过 NuGet 添加这个 Install-Package Microsoft.Extensions.Options.ConfigurationExtensions 问题得到解决,在此感谢 @Artech
我们来测试一下:
OK,这样,我们在文章开始提出的两个问题就都得到了解决!