Asp.Net Core 读取配置文件的多种方式 看这一篇就够了!

22 篇文章 5 订阅

本文聚焦点为 读取配置文件 如想了解文件系统的可看
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 );
        }
    }
  1. 在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:在使用的地方使用对象

数据源:

  1. 常用的就是文件 比如appsettings.json 文件里面的内容或者是自己的json文件,xml文件等等
  2. 没有文件 就是单纯的几个内容用字典项表示 一般就当作内存数据源
  3. 命令行数据源
  4. 多个相同类的数据源 一般是 不同环境的时候 只是内容变化 但是结构一致
  //数据源是字典
           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; }
       
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值