.net core Configuration物件

初夏的陽光丶發表於2020-09-10

前因:最近在閱讀.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完成,另外一個重要的問題是:在這裡我們沒有上下文,所以沒有辦法直接獲取環境的上下文,所以在下面就沒有介紹,但是,凡事不是必須的,這個問題是有解決答案的,如果大家需要,可以在下方留言,

如有哪裡講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧

相關文章