.NET Core日志配置的方法
熟悉asp.net的开发者一定对web.config文件不陌生。在asp.net环境中,要想添加配置参数,一般也都会在此文件中操作。其中最常用的莫过于appsettings与connectionstrings两项。而要在代码中获得文件中的配置信息,configurationmanager则是必不可少需要引入的程序集。
然而到了asp.net core时代,存储与读取配置的方式都发生了改变。
如果对asp.net core项目有所了解的话,应该会看到过appsettings.json这个文件。这里就从json文件配置方式开始解释asp.net core中是如何读取配置信息的。
假设有预先设置的appsettings.json文件:
{ "option1": "value1_from_json", "option2": 2, "subsection": { "suboption1": "subvalue1_from_json" }, "wizards": [ { "name": "gandalf", "age": "1000" }, { "name": "harry", "age": "17" } ] }
在代码中读取可以按下面的方式操作:
public class program { public static iconfiguration configuration { get; set; } public static void main(string[] args = null) { var builder = new configurationbuilder() .setbasepath(directory.getcurrentdirectory()) .addjsonfile("appsettings.json"); configuration = builder.build(); console.writeline($"option1 = {configuration["option1"]}"); console.writeline($"option2 = {configuration["option2"]}"); console.writeline( $"suboption1 = {configuration["subsection:suboption1"]}"); console.writeline(); console.writeline("wizards:"); console.write($"{configuration["wizards:0:name"]}, "); console.writeline($"age {configuration["wizards:0:age"]}"); console.write($"{configuration["wizards:1:name"]}, "); console.writeline($"age {configuration["wizards:1:age"]}"); console.writeline(); console.writeline("press a key..."); console.readkey(); } }
首先,实例化一个configurationbuilder对象,接着设置基础路径。
setbasepath的操作其实是在configurationbuilder的属性字典里设置fileprovider的值。 public static iconfigurationbuilder setbasepath(this iconfigurationbuilder builder, string basepath) { ... return builder.setfileprovider(new physicalfileprovider(basepath)); } public static iconfigurationbuilder setfileprovider(this iconfigurationbuilder builder, ifileprovider fileprovider) { ... builder.properties[fileproviderkey] = fileprovider ?? throw new argumentnullexception(nameof(fileprovider)); return builder; }
然后是添加json文件。
public static iconfigurationbuilder addjsonfile(this iconfigurationbuilder builder, ifileprovider provider, string path, bool optional, bool reloadonchange) { ... return builder.addjsonfile(s => { s.fileprovider = provider; s.path = path; s.optional = optional; s.reloadonchange = reloadonchange; s.resolvefileprovider(); }); } public static iconfigurationbuilder addjsonfile(this iconfigurationbuilder builder, action<jsonconfigurationsource> configuresource) => builder.add(configuresource);
configurationbuilder里添加了一个jsonconfigurationsource对象。
最后,执行configurationbuilder的build方法,就可以得到保存配置信息的configuration对象。
总结例子中的代码,获取配置信息的操作其实就分为两步:
1.生成configuration对象
2.按键值从configuration对象中获取信息
生成configuration对象的步骤至少要有三个基础环节。
1.生成configurationbuilder对象
2.添加configurationsource对象
3.创建configuration对象
查看创建configuration对象的代码,会发现内部利用的其实是configurationsource中创建的configurationprovider对象。
public iconfigurationroot build() { var providers = new list<iconfigurationprovider>(); foreach (var source in sources) { var provider = source.build(this); providers.add(provider); } return new configurationroot(providers); }
再看iconfiguratonsource接口,也只有一个build方法。
public interface iconfigurationsource { iconfigurationprovider build(iconfigurationbuilder builder); }
最终创建的configuration对象,即configurationroot中包含了所有的configurationprovider,说明配置信息都由这些configurationprovider所提供。
跟踪至configurationroot类型的构造方法,果然在其生成对象时,对所有configurationprovider进行了加载操作。
public configurationroot(ilist<iconfigurationprovider> providers) { ... _providers = providers; foreach (var p in providers) { p.load(); changetoken.onchange(() => p.getreloadtoken(), () => raisechanged()); } }
比如jsonconfigurationprovider中:
public override void load(stream stream) { try { data = jsonconfigurationfileparser.parse(stream); } ... }
通过json解析器,将json文件的配置信息读取至configurationprovider的data属性中。这个属性即是用于保存所有配置信息。
/// <summary> /// the configuration key value pairs for this provider. /// </summary> protected idictionary<string, string> data { get; set; }
有了configurationroot对象后,获取配置信息的操作就很简单了。遍历各个configurationprovider,从中获取第一个匹配键值的数据。
public string this[string key] { get { foreach (var provider in _providers.reverse()) { string value; if (provider.tryget(key, out value)) { return value; } } return null; } ... }
configurationprovider对象从data属性获取配置的值。
public virtual bool tryget(string key, out string value) => data.trygetvalue(key, out value);
在最初的例子中可以看configuration["wizards:0:name"]
这样的写法,这是因为在load文件时,存储的方式就是用:为分隔符,以作为嵌套对象的键值。
也可以用另一种方法来写,将配置信息绑定为对象。
先定义对象类型:
public class appsettings { public string option1 { get; set; } public int option2 { get; set; } public subsection subsection { get; set; } public ilist<wizards> wizards { get; set; } } public class subsection { public string suboption1 { get; set; } } public class wizards { public string name { get; set; } public string age { get; set; } }
再绑定对象:
static void main(string[] args) { var builder = new configurationbuilder() .setbasepath(directory.getcurrentdirectory()) .addjsonfile("appsettings.json"); configuration = builder.build(); var appconfig = new appsettings(); configuration.bind(appconfig); console.writeline($"option1 = {appconfig.option1}"); console.writeline($"option2 = {appconfig.option2}"); console.writeline( $"suboption1 = {appconfig.subsection.suboption1}"); console.writeline(); console.writeline("wizards:"); console.write($"{appconfig.wizards[0].name}, "); console.writeline($"age {appconfig.wizards[0].age}"); console.write($"{appconfig.wizards[1].name}, "); console.writeline($"age {appconfig.wizards[1].age}"); console.writeline(); console.writeline("press a key..."); console.readkey(); }
写法变成了常见的对象调用属性方式,但结果是一样的。
除了可以用json文件存储配置信息外,asp.net core同时也支持ini与xml文件。当然有其它类型文件时,也可以通过实现iconfigurationsource接口并继承configurationprovider类建立自定义的configrationprovider对象来加载配置文件。
至于文件以外的方式,asp.net core也提供了不少。
- 命令行,addcommandline
- 环境变量,addenvironmentvariables
- 内存, addinmemorycollection
- 用户机密,addusersecrets
- azure key vault,addazurekeyvault
选择何种存储与读取配置的方法取决于实际场景,asp.net core已经开放了配置方面的入口,任何接入方式理论上都是可行的。实践方面,则需要开发者们不断去尝试与探索。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
ASP.NET Core 2.2 WebApi 系列【三】AutoFac 仓储接口的依赖注入
-
NET Framework项目移植到NET Core上遇到的一系列坑(2)
-
apache禁止搜索引擎收录、网络爬虫采集的配置方法
-
在Linux系统上配置SNMP的方法
-
win7系统打开Excel提示配置标识不正确系统无法开始服务器进程的解决方法图文教程
-
QQ日志文章内容使用发光字体的方法
-
smarty模板引擎从配置文件中获取数据的方法
-
linux服务器下通过iptables+Denyhost抵御暴力破解的配置方法
-
Windows下PHP安装路径配置错误导致Apache无法启动的解决方法
-
Node.js利用debug模块打印出调试日志的方法