Nuget包安装
//ConfigurationBuilder 依赖:
Microsoft.Extensions.Configuration
//AddJsonFile 依赖:
Microsoft.Extensions.Configuration.Json
//.Get<Configs> 依赖:
Microsoft.Extensions.Configuration.Binder
读取方式(本次采用 控制台程序 演示)
在项目中添加JSON配置文件 config.json
{
"name": "aaa--2",
"AppSettings": {
"SystemName": "我的网站---333333333"
},
"Domain": {
"ImgUrl": "aaaa",
"H5Url": "bbbb"
},
"Connections": [
{
"Key": "default",
"Value": "Data Source=.,1433;Initial Catalog=xxx;Persist Security Info=True;User ID=sa;Password=123",
"DbContext": "DataContext",
"DBType": "SqlServer"
}
]
}
1、传统的 手动读取配置
/// <summary>
/// 传统的 手动读取配置
/// 根节点:configRoot["name"]
/// 二级节点:configRoot.GetSection("Domain:ImgUrl").Value;
/// 列表节点:configRoot.GetSection("Connections:0:Value");
/// </summary>
public static void Read1()
{
//手动读取配置
ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("config.json",
optional: false,//optional=false 的时候 如果无文件 会报错
reloadOnChange: false);//reloadOnChange=如果文件修改了,重新加载配置
IConfigurationRoot configRoot = configBuilder.Build();
string name = configRoot["name"];
string ImgUrl = configRoot.GetSection("Domain:ImgUrl").Value;
string ImgUrl2 = configRoot["Domain:ImgUrl"];
var ConnectionsValue = configRoot.GetSection("Connections:0:Value");
}
2、绑定类读取配置
- Configs.cs
public class Configs { public string Name { get; set; } public Dictionary<string, string> AppSettings { get; set; } public List<ConfigConnection> Connections { get; set; } public ConfigDomain Domain { get; set; } } public class ConfigDomain { public string ImgUrl { get; set; } public string H5Url { get; set; } } public class ConfigConnection { public string Key { get; set; } public string Value { get; set; } public string DbContext { get; set; } public string DBType { get; set; } }
- 读取配置
/// <summary> /// 绑定类读取配置 /// 绑定一个类,自动完成额配置的读取 /// NuGet 安装:Microsoft.Extensions.Configuration.Binder /// 读取方式: /// 1、绑定整个json结构:configRoot.Get<Configs>() /// 2、绑定指定节点:configRoot.GetSection("Domain").Get<ConfigDomain>();// Domain 节点的 /// 3、绑定列表节点:configRoot.GetSection("Connections").Get<List<ConfigConnection>>();//Connections 节点的 /// </summary> public static void Binder() { ConfigurationBuilder configBuilder = new ConfigurationBuilder(); configBuilder.AddJsonFile("config.json", optional: false,//optional=false 的时候 如果无文件 会报错 reloadOnChange: false);//reloadOnChange=如果文件修改了,重新加载配置 IConfigurationRoot configRoot = configBuilder.Build(); var config = configRoot.Get<Configs>();//整个json结构 var domain = configRoot.GetSection("Domain").Get<ConfigDomain>();// Domain 节点的 var connections = configRoot.GetSection("Connections").Get<List<ConfigConnection>>();//Connections 节点的 }
3、通过DI 注册服务(.net core Web应用 默认采用这种)
- Program.cs
ServiceCollection services = new ServiceCollection(); services.AddScoped<HomeController>(); //注册配置 ConfigurationBuilder configBuilder = new ConfigurationBuilder(); configBuilder.AddJsonFile("config.json", optional: false,//optional=false 的时候 如果无文件 会报错 reloadOnChange: true);//reloadOnChange=true 如果文件修改了,重新加载配置 IConfigurationRoot configRoot = configBuilder.Build(); //services.Configure<Configs>(e => configRoot.Bind(e)); services.AddOptions().Configure<Configs>(e => configRoot.Bind(e)); using (var sp = services.BuildServiceProvider()) { while (true) { using (var scope = sp.CreateScope()) { var c = scope.ServiceProvider.GetRequiredService<HomeController>(); c.Index2(); Thread.Sleep(2000); } } }
- HomeController.cs
public class HomeController { //单例,不支持数据变化(重启更新),性能高 private readonly IOptions<Configs> _OptConfig; //单例,实时变更(侦听器OnChange) private readonly IOptionsMonitor<Configs> _OptMonitorConfig; //作用域注册,单次请求内不变 private readonly IOptionsSnapshot<Configs> _OptSnapshotConfig; private readonly IServiceProvider _ServiceProvider; public HomeController(IOptions<Configs> optConfig, IOptionsMonitor<Configs> optMonitorConfig, IOptionsSnapshot<Configs> optSnapshotConfig, IServiceProvider serviceProvider) { this._OptConfig = optConfig; this._OptMonitorConfig = optMonitorConfig; this._OptSnapshotConfig = optSnapshotConfig; this._ServiceProvider = serviceProvider; } public void Index2() { Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]--_OptConfig_Name={_OptConfig.Value.Name}---{DateTime.Now.ToString("HH:ss")}"); Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]--Snapshot_Name={_OptSnapshotConfig.Value.Name}---{DateTime.Now.ToString("HH:ss")}"); Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]--Monitor_Name={_OptMonitorConfig.CurrentValue.Name}---{DateTime.Now.ToString("HH:ss")}"); Console.WriteLine("\r\n"); } }