ASP.NET Core 所使用的應用程式設定是由 ConfigurationProvider 所建立的 key-value 資料結構。ConfigurationProvider 會讀取不同的設定來源並轉成 key-value 資料結構。設定來源可能是:
有些設定來源可能會是階層式的資料,ConfigurationProvider 會用分隔符號把階層式資料攤平成 key-value 的結構,例如下面的 JSON 檔案:
{
"profile": {
"name": "Rex",
"creations": {
"blogs": [{
"title": ".NET Core 介紹",
}, {
"title": "常用 dotnet 命令介紹"
}],
"projects": [{
"name": "ironman2018",
}]
}
},
}
當這個檔案被讀進來時,會建立對應攤平後的 key 值來維護原本的階層式結構。框架中是使用 :
(冒號)來組合攤平後的 key 值。所以上面的 JSON 檔案在應用程式中會變成下列 key 值:
當設定被建立後,應用程式中可以透過注入 IConfiguration
來使用這些設定值。
應用程式會在 Main
方法中呼叫 CreateWebHost
時指定設定來源。在 ASP.NET Core 2.0 之前,要使用 ConfigurationBuilder
類別來建立應用程式設定;ASP.NET Core 2.1 開始則提供 ConfigureAppConfiguration
擴充方法來做設定。
public class Program
{
private static Dictionary<string, string> _inMemoryConfig = new Dictionary<string, string>
{
{"profile:name", "Rex"},
{"profile:creations:blogs:0:title", ".NET Core 介紹"},
{"profile:creations:blogs:1:title", "常用 dotnet 命令介紹"},
{"profile:creations:projects:0:name", "ironman2018"}
};
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var startupAssemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
// ASP.NET Core 2.0 or earlier
// var configuration = new ConfigurationBuilder()
// .SetBasePath(Directory.GetCurrentDirectory())
// .AddInMemoryCollection(_inMemoryConfig)
// .AddJsonFile("appsettings.json")
// .AddCommandLine(args)
// .Build();
//
// return WebHost.CreateDefaultBuilder(args)
// .UseConfiguration(configuration)
// .UseStartup(startupAssemblyName);
return WebHost.CreateDefaultBuilder(args)
// ASP.NET Core 2.1 or later
.ConfigureAppConfiguration((hostContext, configBuilder) =>
{
configBuilder
.SetBasePath(Directory.GetCurrentDirectory())
.AddInMemoryCollection(_inMemoryConfig)
.AddJsonFile("appsettings.json")
.AddCommandLine(args);
})
.UseStartup(startupAssemblyName);
}
}
指定設定來源時可以依序加入不同來源,如果不同來源有相同的 key 值,會使用最後加入的來源。
IConfiguration
提供幾個擴充方法來取得應用程式設定的值或集合片段。
GetValue<T>
這個方法接收兩個參數。第一個參數為要取得的設定 key 值;第二個參數可依需要傳入,代表找不到 key 值時的預設值。
下列範例會從設定中取得 profile:name
對應的設定值,同時轉換成 string
型態。如果找不到,會傳回 Not Rex?
。
var authorName = _config.GetValue<string>("profile:name", "Not Rex?");
GetSection
根據第一個參數傳入的 key 值,傳回對應的設定片段,回傳 IConfigurationSection
。
var profileSection = _config.GetSection("profile");
GetChildren
取得特定片段的子片段,回傳 IEnumerable<IConfigurationSection>
。
Exists
用來判斷特定的 key 值是否存在設定中。