前面写过一篇《.NET Core类库中读取配置文件》 ,当时对于.NET Core读取配置文件了解有限,这里做下补充:
配置文件内容如下:
{ "url": "homeinns.com", "person": { "name": "xfh", "age": 26 } }
引用Microsoft.Extensions.Configuration.Json
包
using System; using System.Configuration; using System.IO; using Microsoft.Extensions.Configuration; namespace coreapp { class Program { /// <summary> /// 加载配置文件,构建IConfigurationRoot /// </summary> private static readonly IConfigurationBuilder ConfigurationBuilder = new ConfigurationBuilder(); /// <summary> /// 获取配置文件中的内容,继承自IConfiguration /// </summary> private static IConfigurationRoot _configuration; static void Main(string[] args) { _configuration = ConfigurationBuilder .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile(cfg => { cfg.Path = "config.json"; cfg.ReloadOnChange = true; cfg.Optional = false; }) //Build方法的调用要在AddJsonFile之后,否则生成的IConfigurationRoot实例的 //Providers属性不包含任何元素而导致无法读取文件中的信息 .Build(); var url = _configuration.GetSection("url"); //读取json对象,在IConfiguration中,配置文件中的key都是扁平化的 var pAge = _configuration["person:age"]; //遍历配置文件中的所有元素 foreach (var keyValuePair in _configuration.AsEnumerable()) { Console.WriteLine($"{keyValuePair.Key} - {keyValuePair.Value}"); } } } }
还可以将文件内容映射到对象上,需额外引用Microsoft.Extensions.Configuration.Binder
包:
class ConfigModel { public string Url { set; get; } public Person Person { set; get; } } public class Person { public string Name { set; get; } public int Age { set; get; } } var configModel = new ConfigModel(); ConfigurationBuilder.Build().Bind(configModel);
在ASP.NET Core中,还可以使用IOptions<T>来获取配置信息,但当配置文件被修改时,IOptions<T>中的内容并不会发生改变,不过可以使用IOptionsSnapshot来解决这个问题。
public IConfigurationRoot Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.Configure<ConfigModel>(Configuration); } //然后通过IoC获取IOptions<T> public void Method(IOptions<ConfigModel> opt) { }
以上,是对json文件的操作,接下来操作xml文件。
若要像在.NET Framework中那样读取读取App.config
或Web.config
,引入System.Configuration.ConfigurationManager
包即可:
var value = ConfigurationManager.AppSettings["key"]; Console.WriteLine(value); Console.WriteLine(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);
或者,引用Microsoft.Extensions.Configuration.Xml
包,
_configuration = ConfigurationBuilder .SetBasePath(Directory.GetCurrentDirectory()) .AddXmlFile("App.config") .Build(); //不如使用ConfigurationManager方便了,在appSettings节点下添加多个key还会导致读取时抛异常 var value = _configuration.GetSection("appSettings:add:value").Value;
推荐阅读
用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目