前因:最近在閱讀.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完成,另外一個重要的問題是:在這裡我們沒有上下文,所以沒有辦法直接獲取環境的上下文,所以在下面就沒有介紹,但是,凡事不是必須的,這個問題是有解決答案的,如果大家需要,可以在下方留言,
如有哪裡講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧