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");
}
}