本学习文章学习自: https://www.cnblogs.com/libingql/p/11326358.html
以下仅为个人的温习学习记录
控制台应用程序:
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.Json
{
"id": "1",
"login": {
"isDelete": false,
"loginInfo": {
"username": "叶大白",
"password": "123456"
}
},
"userInfo":{
"username": "叶大白2",
"password": "7890"
},
"adressInfo": [
{
"adress": "安徽合肥"
},
{
"adress": "安徽芜湖"
}
]
}
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile(".Development.json", optional: true, reloadOnChange: true);
var config = builder.Build();
//如果需要遍历,所有的配置文件的数据
foreach (var provider in config.Providers)
{
provider.TryGet("ConnectionStrings:DefaultContext", out string defaultContext);
Console.WriteLine(defaultContext);
}
操作配置的方法汇总:
1. .SetBasePath(Directory.GetCurrentDirectory()) 设置从哪个目录读取配置文件 (Dir.. 获取当前进行所在的根目录)
(如果appsettings.json在configs目录中,那么调用AddJsonFile应该指定的路径为"configs/appsettings.json"。)
2. .AddJsonFile("appsettings.json") (配置键相同时,读取选择最后一个添加的文件(AddJsonFile), 若要读取所有添加文件的配置信息,可遍历ConfigurationRoot的Providers属性。)。
添加读取json格式的文件 (如果使用xml和lni,AddXmlFile("appsettings.xml)或AddIniFile("appsettings.ini")) ,reloadOnChange 配置为true 可以进行热更新。
读取json的方式:
1.key 读取 (键不区分大小写。 例如,ConnectionString 和 connectionstring 被视为等效键,分层键使用冒号分隔符 (:),
读取数组形式的配置,使用数组的下标索引,0表示第一个。
Configuration["id"]; // 结果 1
Configuration["login:isDelete"]; // 结果 false
Configuration["login:loginInfo:username"]; // 结果 叶大白
Configuration["adressInfo:0:adress"]; // 结果 安徽合肥
2. 绑定简单数据类型 GetValue<T> (添加Package:Microsoft.Extensions.Configuration.Binder)
var appID = config.GetValue<int>("AppID");
3. 绑定到类对象 Get<T>
public class userInfo
{
public string username { get; set; }
public string password { get; set; }
}
var node = config.GetSection("userInfo").Get<userInfo>();
4. 绑定集合对象
"Test": {
"userInfo": [
{
"username": "测试",
"password": "密码"
},
{
"username": "测试2",
"password": "密码"
},
{
"username": "测试3",
"password": "密码"
}
]
}
var children = config.GetSection("Test:userInfo").Get<IEnumerable<userInfo>>();
API应用程序
api应用程序。会在根目录下自动创建Program.cs:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
其中,CreateDefaultBuilder创建默认配置。(CreateDefaultBuilder的创建内容=>https://zhuanlan.zhihu.com/p/82978246?from_voters_page=true)
按以下顺序加载应用配置 appsettings.json => appsettings.{Environment}.json。
1) ConfigureServices中键值读取
在Startup.cs中,默认带有属性
调用的方式是在ConfigureServices() 中采用键值对方式读取:
int appid = Configuration.GetValue<int>("id");
var nodes = config.GetSection("Test:userInfo").Get<IEnumerable<userInfo>>();
2) ConfigureServices中使用Options
添加安装包:Microsoft.Extensions.Options.ConfigurationExtensions
首先什么是Options。options是为了方便了在.NET Core应用程序中使用强类型配置。
可以将config直接序列化。进行操作。否则需要
1)将配置文件(比如appsettings.json)中的配置反序列化至配置类的实例中
2)注入配置类的单例
使用时只需要构造注入即可在控制器中使用config的内容了:
3) 自定义读取配置文件
1.新建一个配置文件 test.json
{
"id" : 100
}
2.修改Program.js (在调用startup前。增加读取配置的json)
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("test.json", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();
3.调用
public void ConfigureServices(IServiceCollection services)
{
string id= Configuration.GetSection("id").Value;
}
4) 独立类中读取配置
在.Net Framework中,ConfigurationManager类用于读取配置文件。但在.Net Core中没有该类,新建类ConfigurationManager用于读取配置文件。这样就可以像之前一样key取了
public static class ConfigurationManager
{
public readonly static IConfiguration Configuration;
static ConfigurationManager()
{
Configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
}
public static T GetSection<T>(string key) where T : class, new()
{
return new ServiceCollection()
.AddOptions()
.Configure<T>(Configuration.GetSection(key))
.BuildServiceProvider()
.GetService<IOptions<T>>()
.Value;
}
public static string GetSection(string key)
{
return Configuration.GetValue<string>(key);
}
}