Json配置
:::info Nuget下载包:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
:::
示例代码:
{"name": "校长","age": 18,"proxy": {"server": "http://www.baidu.com","port": "8080"}}
internal class Program{static void Main(string[] args){ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);IConfigurationRoot config = configurationBuilder.Build();string name = config["name"];Console.WriteLine($"name={name}");var server = config.GetSection("proxy:server").Value;Console.WriteLine($"server={server}");Proxy proxy = config.GetSection("proxy").Get<Proxy>();Console.WriteLine($"server={proxy.Server},prot={proxy.port}");Console.WriteLine();Console.Read();}}class Proxy{public string Server { get; set; }public int port { get; set; }}
IOC选项方式读取配置
:::info
- IOptions //直接单例,读出来就缓存,不支持数据变化,性能高—只能读默认名字
- IOptionsMonitor // 只读一次,写入缓存——-但是支持数据修改,靠的是监听文件更新(onchange)数据,实时变更
- IOptionsSnapshot //作用域注册,一次请求内数据是缓存不变的,但是不同请求是每次都会重新第一次数据
:::
using Microsoft.Extensions.Configuration;using Microsoft.Extensions.Configuration.Json;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Options;static void Main(string[] args){ServiceCollection services = new ServiceCollection();services.AddScoped<Controller>();ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);IConfigurationRoot configurationRoot = configurationBuilder.Build();services.AddOptions().Configure<Config>(e => configurationRoot.Bind(e));using (var s = services.BuildServiceProvider()){while (true){using(var sp = s.CreateScope()){Controller controller = sp.ServiceProvider.GetRequiredService<Controller>();controller.Test();Console.WriteLine("修改JSON文件。。。");Console.WriteLine("请输入,,");Console.Read();}}}Console.Read();}public class Config{public string Name { get; set; }public int Age { get; set; }public Proxy proxy { get; set; }}public class Proxy{public string Server { get; set; }public int port { get; set; }}public class Controller{private readonly IOptions<Config> optConfig1;///直接单例,读出来就缓存,不支持数据变化,性能高--只能度默认名字private readonly IOptionsSnapshot<Config> optConfig;//作用域注册,一次请求内数据是缓存不变的,但是不同请求是每次都会重新第一次数据private readonly IOptionsMonitor<Config> optConfig2;//只读一次,写入缓存-----但是支持数据修改,靠的是监听文件更新(onchange)数据,实时变更public Controller(IOptionsSnapshot<Config> config, IOptions<Config> optConfig1, IOptionsMonitor<Config> optConfig2){this.optConfig = config;this.optConfig1 = optConfig1;this.optConfig2 = optConfig2;}public void Test(){Console.WriteLine($"IOptions:{optConfig1.Value.Name},{optConfig1.Value.Age}");Config config = optConfig.Value;Console.WriteLine($"IOptionsSnapshot:{config.Name},{config.Age}");Console.WriteLine($"IOptionsMonitor:{optConfig2.CurrentValue.Name},{optConfig2.CurrentValue.Age}");}}
