asp.net core 系列 11 配置configuration (下)
四. 文件配置提供程序AddIniFile、 AddXmlFile、AddJsonFile
FileConfigurationProvider 是從文件系統加載配置的基類。 以下配置提供程序專用於特定文件類型:
(1) INI 配置提供程序 IniConfigurationProvider: FileConfigurationProvider
(2) JSON 配置提供程序 JsonConfigurationProvider: FileConfigurationProvider
(3) XML 配置提供程序 XmlConfigurationProvider: FileConfigurationProvider
4.1 INI 配置提供程序
IniConfigurationProvider 在運行時從 INI 文件鍵值對加載配置,若要激活 INI 文件配置,請在 ConfigurationBuilder 的實例上調用 AddIniFile 擴展方法。冒號可用作 INI 文件配置中的節分隔符。下面是一個ini配置文件通用示例:
[section0] key0=value key1=value [section1] subsection:key=value [section2:subsection0] key=value [section2:subsection1] key=value
//下面是獲取各節點中的value值,需要加載的鍵。 section0:key0 section0:key1 section1:subsection:key section2:subsection0:key section2:subsection1:key
下面示例是使用config.AddIniFile方法加載一個config.ini文件,該方法重載允許指定:(1) optional文件是否可選,(2)reloadOnChange如果文件更改,是否重載配置。IFileProvider只讀該文件。
config.SetBasePath(Directory.GetCurrentDirectory()); config.AddIniFile("config.ini", optional: true, reloadOnChange: true);
//OtherPages/Page1頁面訪問,val 值value string val= Configuration.GetSection("section0").GetSection("key0").Value;
4.2 JSON 配置提供程序
JsonConfigurationProvider 在運行時期間從 JSON 文件鍵值對加載配置。若要激活 JSON 文件配置,請在 ConfigurationBuilder 的實例上調用 AddJsonFile 擴展方法。下面是使用config. AddJsonFile方法加載一個config.json文件,具體格式可參考appsettings.json
config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile("config.json", optional: true, reloadOnChange: true);
效果就不再具體演示,重點講下註意事項:使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時,會自動調用 AddJsonFile 兩次。 調用該方法來從以下文件加載配置:(1)appsettings.json – 首先讀取此文件。(2) appsettings.{Environment}.json。也就是說調用二次AddJsonFile後,AddJsonFile才會調用上面顯示指定的config.json.
4.3 XML 配置提供程序
XmlConfigurationProvider 在運行時從 XML 文件鍵值對加載配置。若要激活 XML 文件配置,請在 ConfigurationBuilder 的實例上調用 AddXmlFile 擴展方法。XML文件創建配置鍵值對時,將忽略配置文件的根節點。 不要在文件中指定文檔類型定義 (DTD) 或命名空間。
config.SetBasePath(Directory.GetCurrentDirectory()); config.AddXmlFile("config.xml", optional: true, reloadOnChange: true);
(1)下面是一個xml配置文件通用示例:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <section0> <key0>value</key0> <key1>value</key1> </section0> <section1> <key0>value</key0> <key1>value</key1> </section1> </configuration>
//下面是獲取各節點中的value值,需要加載的鍵。 section0:key0 section0:key1 section1:key0 section1:key1
(2) 如果使用 name 屬性來區分元素,則使用相同元素名稱的重復元素可以正常工作:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <section name="section0"> <key name="key0">value</key> <key name="key1">value</key> </section> <section name="section1"> <key name="key0">value</key> <key name="key1">value</key> </section> </configuration> //下面是獲取各節點中的value值,需要加載的鍵。 section:section0:key:key0 section:section0:key:key1 section:section1:key:key0 section:section1:key:key1
(3) 屬性可用於提供值
<?xml version="1.0" encoding="UTF-8"?> <configuration> <key attribute="value" /> <section> <key attribute="value" /> </section> </configuration> //下面是獲取各屬性中的value值,需要加載的鍵。 key:attribute section:key:attribute
五. Key-per-file 配置提供程序 AddKeyPerFile
KeyPerFileConfigurationProvider 使用目錄的文件作為配置鍵值對。 該鍵是文件名。 該值包含文件的內容。 Key-per-file 配置提供程序用於 Docker 托管方案。若要激活 Key-per-file 配置,請在 ConfigurationBuilder 的實例上調用 AddKeyPerFile 擴展方法。 文件的 directoryPath 必須是絕對路徑。
下面示例是使用config.AddKeyPerFile方法加載一個目錄文件,在使用Docker 托管時具體參考官方文檔。
config.SetBasePath(Directory.GetCurrentDirectory()); var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files"); config.AddKeyPerFile(directoryPath: path, optional: true);
六. 內存配置提供程序AddInMemoryCollection
MemoryConfigurationProvider 使用內存中集合作為配置鍵值對。若要激活內存中集合配置,請在 ConfigurationBuilder 的實例上調用 AddInMemoryCollection 擴展方法。
/// <summary> /// 構建內存對象的鍵值對 /// </summary> public static readonly Dictionary<string, string> _dict = new Dictionary<string, string> { {"MemoryCollectionKey1", "value1"}, {"MemoryCollectionKey2", "value2"} }; public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.AddInMemoryCollection(_dict); }) .UseStartup<Startup>();
//OtherPages/Page1頁面訪問,val 值value string val=Configuration.GetSection("MemoryCollectionKey1").Value
七. 讀取GetValue、GetSection、GetChildren 和 Exists
7.1 GetValue
ConfigurationBinder.GetValue<T> 從具有指定鍵的配置中提取一個值,並將其轉換為指定類型。 如果未找到該鍵,則重載允許你提供默認值。以下示例使用鍵 NumberKey 從配置中提取字符串值,鍵入該值作為 int,並將值存儲在變量 intValue 中。 如果在配置鍵中找不到 NumberKey,則 intValue 會接收 99 的默認值。
var intValue = config.GetValue<int>("NumberKey", 99);
7.2 GetSection
IConfiguration.GetSection 使用指定的子節鍵提取配置子節。GetSection 永遠不會返回 null。 如果找不到匹配的節,則返回空 IConfigurationSection。
{ "section0": { "key0": "value", "key1": "value" }, "section1": { "key0": "value", "key1": "value" }, "section2": { "subsection0" : { "key0": "value", "key1": "value" }, "subsection1" : { "key0": "value", "key1": "value" } } }
//返回僅包含 section1 中鍵值對的 IConfigurationSection 對象 var configSection = _config.GetSection("section1"); //獲取 section2:subsection0 中鍵的值 var configSection = _config.GetSection("section2:subsection0");
7.3 GetChildren
//在上面的json結構中,獲取section2下面的子節點 var configSection = _config.GetSection("section2"); var children = configSection.GetChildren();
7.4 Exists
//在上面的json結構中,確定配置節是否存在, 為false,是因為配置數據中沒有 section2:subsection2 節點 var sectionExists = _config.GetSection("section2:subsection2").Exists();
八. 綁定到類
使用GetSection方法調用 Bind 可以構造 POCO 對象。POCO就是簡單CLR對象(Plain Old CLR Object),這種類不繼承於任何對象(或者說直接繼承於Object),示例應用包含 Starship 模型 (Models/Starship.cs)。
config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile("starship.json",false,true);
Starship實體對應JSON的 starship
節點
{ "starship": { "name": "USS Enterprise", "registry": "NCC-1701", "class": "Constitution", "length": 304.8, "commissioned": false }, "trademark": "Paramount Pictures Corp. http://www.paramount.com" }
// OtherPages/Page1頁面綁定starship 節點到Starship實體中 var starship = new Models.Starship(); Configuration.GetSection("starship").Bind(starship);
總結:
Configuration配置的其它知識點如:將數組綁定至類、自定義配置提供程序、在啟動期間訪問配置、在 Razor Pages 頁或 MVC 視圖中訪問配置等等, 請參考官方文檔。
在Configuration配置的上下二篇中,講到了Configuration對不同配置來源的加載和讀取方法,Microsoft.Extensions.Configuration.IConfiguration中全是以Get開頭的只讀方法,並沒有涉及到對配置來源(如json或xml文件)的增刪改操作。像配置的xml文件,是否需要引入System.Xml.Linq來操作xml文件的增刪改操呢?帶著這個疑問在以後章節再了解。
參考文獻
官方資料:asp.net core 配置
asp.net core 系列 11 配置configuration (下)