zoukankan      html  css  js  c++  java
  • .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完成,另外一个重要的问题是:在这里我们没有上下文,所以没有办法直接获取环境的上下文,所以在下面就没有介绍,但是,凡事不是必须的,这个问题是有解决答案的,如果大家需要,可以在下方留言,

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

  • 相关阅读:
    DataPipeline CTO陈肃:驱动软件国产化,客户需求是核心引擎
    DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战
    Q&A系列一:DataPipeline常见问题回答
    下篇丨数据融合平台DataPipeline的实际应用场景
    上篇丨数据融合平台DataPipeline的应用场景
    这些传统数据集成的痛,你还在经历吗?
    ETL的两种架构——ETL架构和ELT架构优劣势对比
    2020即将到来,看完这篇帮你详细了解数据策略
    DataPipeline丨「自定义」数据源,解决复杂请求逻辑外部数据获取难题
    SQLI-LABS LESS 1-LESS 22
  • 原文地址:https://www.cnblogs.com/ancold/p/13645890.html
Copyright © 2011-2022 走看看