• .net core Configuration对象


    前因:最近在阅读.net core源码,发现关于Configuration介绍的文档都比较多,但是都比较杂乱,(微软文档太官方),所以写下一些自己的感想

    主要通过三种使用情况来介绍

    • Web应用程序使用
    • 控制台应用程序使用
    • 库类使用

    需要注意的点,假如我同时配置多个配置文件,程序使用的是最后加载的配置文件

    Web应用程序使用

    首先简述一下web主机创建配置对象的过程

    
    public class Program
    {
      public static void Main(string[] args)
      {
        CreateHostBuilder(args).Build().Run();
      }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
       Host.CreateDefaultBuilder(args)
         .ConfigureAppConfiguration((hostContext, confBuilder) => 
         {
         var env = hostContext.HostingEnvironment;
         confBuilder.AddJsonFile(path: "appSettings.json", optional: true, reloadOnChange: true);
         confBuilder.AddJsonFile(path: $"appSettings.{env.EnvironmentName}.json",optional:true,reloadOnChange:true);
         confBuilder.AddJsonFile(path: "importsettings.json", optional: true, reloadOnChange: true);
         confBuilder.AddEnvironmentVariables();
         confBuilder.AddCommandLine(args);
         confBuilder.AddUserSecrets<Startup>();
         })
        .ConfigureWebHostDefaults(webBuilder =>
        {
         webBuilder.UseStartup<Startup>();
        });
    }
    
    
    
    ConfigureAppConfiguration((hostContext, confBuilder)
    
    

    在这句话中,告诉程序需要使用的主机上下文和配置生成器,这个是一个基本的构建起,可以对其进行修改,直至完成CreateHostBuilder为止

    
    var env = hostContext.HostingEnvironment;
    
    

    获取当前程序的运行环境,比如dev,test,product环境,可以供我们使用不同的配置文件

    
      confBuilder.AddJsonFile(path: "appSettings.json", optional: true, reloadOnChange: true);
      confBuilder.AddJsonFile(path: $"appSettings.{env.EnvironmentName}.json",optional:true,reloadOnChange:true);
      confBuilder.AddJsonFile(path: "importsettings.json", optional: true, reloadOnChange: true);
    
    

    这里其实就是指配置几个不同的配置文件

    
    confBuilder.AddEnvironmentVariables(); 
    confBuilder.AddCommandLine(args);
    
    

    这两行则是大多数应用程序通用的(当然不需要也不影响我们程序的使用)

    
    confBuilder.AddUserSecrets<Startup>();
    
    

    这句话其实是一种安全配置,可以通过配置对象访问Azure的加密存储的用户机密对象的安全存储,第二个是因为启用了Azure,可以安全的访问云配置,Secrets子系统可以在本地运行,也可以基于云运行
    Web应用程序其他一些重要功能,比如依赖注入则是在StartUp.cs文件中体现(当然,如果想,startUp文件也不是必要的)

    控制台应用程序/类库

    
    static void Main(string[] args)
    {
       IConfiguration configuration = new ConfigurationBuilder()
         .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
         .AddJsonFile("importsettings.json", optional: true, reloadOnChange: true)
         .AddEnvironmentVariables()
         .AddCommandLine(args)
         .Build();
    }
    
    
    
    public StarChartDataHandler() : this(new ConfigurationBuilder()
              .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
              .AddJsonFile("importsettings.json", optional: true, reloadOnChange: true)
              .AddEnvironmentVariables()
              .Build())
    { }
    public StarChartDataHandler(IConfiguration config)
    {
         if (config == null)
         {
            config = new ConfigurationBuilder()
                     .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true
                     .AddJsonFile("importsettings.json", optional: true, reloadOnChange: true)
                     .AddEnvironmentVariables()
                     .Build();
         }
    _configuration = config;
         ConfigurationSection userSettings = _configuration.GetSection("userSettings") as ConfigurationSection;
    var defaultStarChartFile = userSettings["DefaultStarChartFile"];
         var starChartFile = userSettings["StarChartFile"];
         var defaultStarChartSchema = userSettings["DefaultStarChartSchema"];
         var starChartSchema = userSettings["StarChartSchema"];
         var starChartDirectory = userSettings["Directory"];
         List<string>  fileList = userSettings.GetSection("StarChartFileList").Get<List<string>>();
    ...
    }
    
    

    控制台应用程序和类库都是需要构造Configuration Builder对象,而不是使用Host Builder完成,另外一个重要的问题是:在这里我们没有上下文,所以没有办法直接获取环境的上下文,所以在下面就没有介绍,但是,凡事不是必须的,这个问题是有解决答案的,如果大家需要,可以在下方留言,

    如有哪里讲得不是很明白或是有错误,欢迎指正
    如您喜欢的话不妨点个赞收藏一下吧

  • 相关阅读:
    ArcGIS Pro获得一个要素图层一种方法
    ArcGIS Pro layout clone
    ActiveMapViewChanged和选择变化
    ArcGIS Pro 改变栅格的数据源
    ArcGIS Pro自定义图标
    Windows Server 2016 路由和远程访问
    IIS应用程序池_缓存回收
    asp.net RSA密钥之C#格式与Java格式转换(PEM格式)
    MD5和Hash
    C# list与数组的转换
  • 原文地址:https://www.cnblogs.com/ancold/p/13645890.html
Copyright © 2020-2023  润新知