1.推荐使用选项的方式读取,和DI(依赖注入)结合更好,且更好利用“reloadOnChange”机制。
2.NuGet安装Microsoft.Extensions.Options、Microsoft.Extensions.Configuration.Binder、Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json。
3.读取配置时,DI要声明IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>等类型。
三者区别:
IOptions<T>只有重启服务才会读取修改后的值。
IOptionsMonitor<T>只要配置项修改,立马读取新的值。
IOptionsSnapshot<T>配置项改了,在同一个范围内(比如ASP.NET Core一个请求中)保持读取同一个配置项的值。建议用IOptionsSnapshot<T>。
代码示例(代码基于.NetCore3.1版本):
引用的程序集如下所示
声明一个json文件,用于放置配置数据:config.json
{
"name": "yzk",
"age": 18,
"proxy": {
"address": "www.yzk.com",
"port": "80"
}
}
声明一个类,用于读取配置数据:ConfigTest
using Microsoft.Extensions.Options;
using System;
namespace ConfigOptions
{
class ConfigTest
{
private readonly IOptionsSnapshot<ConfigJson> options;
public ConfigTest(IOptionsSnapshot<ConfigJson> options)
{
this.options = options;
}
public void Show()
{
Console.WriteLine(options.Value.name);
Console.WriteLine(options.Value.age);
Console.WriteLine(options.Value.proxy);
Console.WriteLine(options.Value.proxy.address);
Console.WriteLine(options.Value.proxy.port);
}
}
}
在main方法中完成依赖注入,配置数据对象绑定等动作
这里需要引用程序集:Microsoft.Extensions.DependencyInjection
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace ConfigOptions
{
class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddTransient<ConfigTest>();//往DI容器中注册自定义类
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
IConfigurationRoot root = configurationBuilder.Build();
//将Options添加到DI容器中
//将ConfigJson对象绑定到根节点上面
services.AddOptions().Configure<ConfigJson>(e => root.Bind(e));
using (var sp = services.BuildServiceProvider())
{
var c = sp.GetRequiredService<ConfigTest>();
c.Show();
}
Console.Read();
}
}
class ConfigJson
{
public string name { get; set; }
public string age { get; set; }
public Proxy proxy { get; set; }
}
class Proxy
{
public string address { get; set; }
public int port { get; set; }
}
}
执行结果:
下面这篇文章写得非常详细: