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

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