Asp.Net Core 读取配置文件的多种方式 看这一篇就够了!
读取方式直接读取单个值读取json对象---变成类使用注册服务读取自定义读取注意事项!!!以此json文件为实列{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","Jwt
本文聚焦点为 读取配置文件 如想了解文件系统的可看
Asp.Net Core 文件系统和配置选项
以此json文件为实列
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"JwtSetting": {
"SecurityKey": "123", // 密钥
"Issuer": "jwtIssuertest", // 颁发者
"Audience": "jwtAudiencetest", // 接收者
"ExpireSeconds": 3600 // 过期时间(3600)
},
"JwtSetting22": {
"JwtSetting2": {
"SecurityKey": "1234", // 密钥
"Issuer": "jwtIssuertest2", // 颁发者
"Audience": "jwtAudiencetest2", // 接收者
"ExpireSeconds": 3600 // 过期时间(3600)
}
}
}
直接读取单个值
单纯简单的使用,较多希望是类似freamwork,一个引用,一句代码就拿到配置
core 这里当然也有直接简单读取方式:
条件:在使用的地方(不是Startup类的时候) 按照Startup中==依赖注入 IConfiguration configuration ==
直接[]单个属性 或者[:]层级找到单个属性
var a = Configuration["AllowedHosts"];//结果为*
var b = Configuration["JwtSetting:SecurityKey"];//结果123
var c = Configuration.GetValue<string>("JwtSetting:SecurityKey");//结果123
var d = Configuration.GetSection("JwtSetting").GetSection("SecurityKey").Value;//结果123
读取json对象—变成类使用
如果想把json对象拿到去使用的话,一般都是转成类去使用,毕竟对于类在熟悉不过了,方便又熟练;
1.创建对应json的类
public class JwtSettingClass //json模块1
{
public string SecurityKey { get; set; }
public string Issuer { get; set; }
public string Audience { get; set; }
public int ExpireSeconds { get; set; }
}
public class JwtSettingClass2 //json模块2
{
public string SecurityKey { get; set; }
public string Issuer { get; set; }
public string Audience { get; set; }
public int ExpireSeconds { get; set; }
}
2.将json对象 绑定到类上 以及 创建对应json文件总的静态类(这样做是json里面的模块多的情况下,好有一个总的类去维护,起到聚合维护代码)
public static class AppSettings //总的类 对应 json大文件 这里负责一一绑定json模块与对象
{
public static JwtSettingClass JwtSettingClass { get; set; }
public static JwtSettingClass2 JwtSettingClass2 { get; set; }
/// <summary>
/// 初始化jwt配置
/// </summary>
/// <param name="configuration"></param>
public static void Init(IConfiguration configuration)
{
//将JwtSetting模块绑到JwtSettingClass 整个绑定
JwtSettingClass = new JwtSettingClass();
configuration.Bind("JwtSetting", JwtSettingClass);
//将JwtSetting2模块绑到JwtSettingClass2 部分绑定也就是:找层级绑定
JwtSettingClass2 = new JwtSettingClass2 ();
configuration.GetSection("JwtSetting22:JwtSetting2").Bind(JwtSettingClass2 );
}
}
- 在statrup 启动的时候,调用进行绑定
public void ConfigureServices(IServiceCollection services)
{
//AppSettings总类进行调用静态方法
AppSettings.Init(Configuration);
}
4.控制器直接使用静态类 静态变量
var a=AppSettings.JwtSetting.SecurityKey;
如果你不想统一维护,或者json模块就很少,那么你可以不建这个对应json文件的总类,直接去写里面的代码,不进行封装这一层即可
public void ConfigureServices(IServiceCollection services)
{
var JwtSettingClass = new JwtSettingClass();
configuration.Bind("JwtSetting", JwtSettingClass);
}
注册服务读取
将注册服务的时候把 配置文件 与类 绑定好值,然后在使用的时候去用
public void ConfigureServices(IServiceCollection services)
{
services.Configure<JwtSetting>(options =>
{
options.Audience = Configuration["JwtSetting.Audience"];
options.ExpireSeconds =Convert.ToInt32(Configuration["JwtSetting.ExpireSeconds"]);
options.Issuer = Configuration["JwtSetting.Issuer"];
options.SecurityKey = Configuration["JwtSetting.SecurityKey"];
});
然后在用的地方IOptions
public BController(IOptions<JwtSetting> settings)
{
var Audience =settings.Value.Audience ;
var Issuer = settings.Value.Issuer );
}
配置选项读取
注册服务的方式有点拉跨,还是要 依靠Configuration获取值给服务绑定,有点繁琐,如果内容太多,总不能要读一遍给服务绑定实体吧,有没有一种我直接拿数据源然后 绑定到实体 直接用,这个过程我也不需要自己动手映射。
所以这就是 配置选项读取,总结而言就是爽,数据源绑定到类对象添加到选项,然后全局依靠IOptions 使用即可!
读取的步骤如下:
1:配置数据源
2:配置构建器 build
3:添加选项的时候配置一下构建的内容与实体类
4:在使用的地方使用对象
数据源:
- 常用的就是文件 比如appsettings.json 文件里面的内容或者是自己的json文件,xml文件等等
- 没有文件 就是单纯的几个内容用字典项表示 一般就当作内存数据源
- 命令行数据源
- 多个相同类的数据源 一般是 不同环境的时候 只是内容变化 但是结构一致
//数据源是字典
var source = new Dictionary<string, string>
{
["SecurityKey"] ="123"
};
var configContent = new ConfigurationBuilder()
.AddInMemoryCollection(source).Build();
services.AddOptions()
.Configure<JwtSetting>(configContent);
//数据源是文件 第二个参数是 是否检查文件存在 第三个参数是 是否检测内容改变在加载
var configContent = new ConfigurationBuilder()
.AddJsonFile("appsettings.json",false,true)
.Build()
.GetSection("JwtSetting");
services.AddOptions()
.Configure<JwtSetting>(configContent);
然后在用的地方IOptions
public BController(IOptions<JwtSetting> settings)
{
var Audience =settings.Value.Audience ;
var Issuer = settings.Value.Issuer );
}
数据源是多个相同结构内容 一般应对不同环境配置 名字正式用的时候可以取环境名字,这里演示暂定name1 name2
//数据源是文件中 多个相同结构内容 对应不同环境
var configContent = new ConfigurationBuilder().AddJsonFile("appsettings.json", false, true).Build();
services.AddOptions()
.Configure<configclass>("name1", configContent.GetSection("JwtSetting"))
.Configure<configclass>("name2", configContent.GetSection("JwtSetting2"));
然后在用的地方IOptionsSnapshot
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IOptionsSnapshot<JwtSetting> _optionsSnapshot;
public HomeController(IOptionsSnapshot<JwtSetting> optionsSnapshot)
{
_logger = logger;
_optionsSnapshot = optionsSnapshot;
}
public IActionResult Index()
{
var a=_optionsSnapshot.Get("name1").Audience;
var b = _optionsSnapshot.Get("name2").Audience;
return View();
}
}
命令行读取
前提条件是 控制台程序 可以映射规则还能 验证规则
dotnet run -n 李四 -a 15 会提示名字不对
static void Main(string[] args)
{
//映射命令行
var mapper = new Dictionary<string, string>() { { "-n", "name" }, { "-a", "age" } };
var configContent = new ConfigurationBuilder().AddCommandLine(args,mapper).Build();
services.AddOptions()
.Configure<configclass>(a =>
{
//手动赋值
a.name = configContent["name"];
a.age = configContent["age"];
})
.Validate(t=>t.name.StartsWith("张"),"名字不对"); //验证规则
}
自定义读取
读取自己的json文件,我有多个配置json文件 读取自己的使用自己的;比如自己的文件appsettings2.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"JwtSetting": {
"SecurityKey": "my", // 密钥
"Issuer": "my", // 颁发者
"Audience": "my", // 接收者
"ExpireSeconds": 36000 // 过期时间(36000)
}
}
那就需要读取自己的json文件
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();//创建ConfigurationBuilder对象
//给configurationBuilder对象设置appsettings的路径
configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings2.json", optional: false, reloadOnChange: true);
var myJsonContent = configurationBuilder.Build();
var a = myJsonContent ["AllowedHosts"]; //直接获取单个值
var JwtSetting = new JwtSetting();
myJsonContent .GetSection("JwtSetting").Bind(JwtSetting);//绑定对象
services.AddOptions()
.Configure<configclass>(configContent);//配置选项
注意事项!!!
1.配置文件指的是appsettings.json 不是 launchSettings.json 别把json内容放错地方了
2.在不是startup之外使用的地方 一定要 注意依赖注入 IConfiguration configuration 才能使用
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
更多推荐
所有评论(0)