.net core學習筆記《新一代的配置系統Configuration在支持多數據源,熱更新,層級化方面代碼快速實踐》
在我們之前.Net Framework的項目中,配置文件是WebConfig或AppcConfig文件,而當我們想要添加我們自定義的節點時,還需要在這個文件中的section中定義我們自定義的節點,這樣的配置文件中的系統配置和我們自定義的配置耦合度也很高。
而在.Net Core中,配置系統改變了,它支持多種數據源,讓配置文件變的不再單一化:json,xml,ini,memory,command, env
以下項目都是以控制臺項目為基礎
一、Json
1、要想加載json文件中的數據,就必須要安裝它所依賴的包,我們打開NuGet包管理器,搜索並安裝 Microsoft.Extensions.Configuration.Json
2、我們在項目中新增一個 appSettings.json 文件,並且設置始終復制到輸出目錄
3、接下來我們看以下代碼:
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("appSettings.json") .Build();var info = configuration["username"]; Console.WriteLine(info); Console.ReadKey(); }
最後我們可以看到控制臺上輸入json文件中的結果
二、Xml
1、要想加載xml文件中的數據,就必須要安裝它所依賴的包,我們打開NuGet包管理器,搜索並安裝 Microsoft.Extensions.Configuration.Xml
2、我們在項目中新增一個 appSettings.xml 文件,並且設置始終復制到輸出目錄
3、接下來我們看以下代碼:
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddXmlFile("appSettings.xml") .Build(); var info = configuration["username"]; Console.WriteLine(info); Console.ReadKey(); }
最後我們可以看到控制臺上輸入xml文件中的結果
三、Ini
1、要想加載ini文件中的數據,就必須要安裝它所依賴的包,我們打開NuGet包管理器,搜索並安裝 Microsoft.Extensions.Configuration.Ini
2、我們在項目中新增一個 appSettings.ini文件,並且設置始終復制到輸出目錄
3、接下來我們看以下代碼:
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddIniFile("appSettings.ini") .Build(); var info = configuration["[user] username"]; Console.WriteLine(info); Console.ReadKey(); }
最後我們可以看到控制臺上輸入ini文件中的結果
四、Memory
1、要想加載MemoryCollection中的數據,就必須要安裝它所依賴的包,我們打開NuGet包管理器,搜索並安裝 Microsoft.Extensions.Configuration 由於以上數據源安裝的時候的包都依賴於它,所有這裏不需要安裝
2、接下來看代碼:
static void Main(string[] args) { List<KeyValuePair<string, string>> initialData = new List<KeyValuePair<string, string>>(); initialData.Add(new KeyValuePair<string, string>("username", "tom")); IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddInMemoryCollection(initialData) .Build(); var info = configuration["username"]; Console.WriteLine(info); Console.ReadKey(); }
最後得出結果tom
五、CommandLine
目錄還沒用過,待研究
六、EnviromentVariables
這個是從環境變量中獲取值
1、我們打開NuGet包管理器,搜索並安裝 Microsoft.Extensions.Configuration.EnvironmentVariables
2、打開你的電腦,右鍵屬性,選擇高級,選擇環境變量,隨便復制一個環境變量名
3、然後將你復制的變量名作為你要獲取該環境變量值的Key
4、以下代碼:
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddEnvironmentVariables() .Build(); var info = configuration["ASPNETCORE_ENVIRONMENT"]; Console.WriteLine(info); Console.ReadKey(); }
以AddJsonFile這個方法為例,我們可以看出,這個方法有多個重載:
public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path);
public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional); public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional, bool reloadOnChange);
optional這個參數表示這個文件是否是可選的,reloadOnChange這個表示文件改變時,是否重新加載這個文件(熱加載)
reloadOnChange=true時,項目在運行,獲取到username這個值為tom,當我們從json文件中改變username的值為lucy時,項目讀取它的值也會立馬發生改變
七、弱類型讀取
以上獲取json文件中的數據都是一維的,那麽二維,三維,多維的時候我們該怎麽獲取呢?
接下來我們調試下,看看最終得到的IConfiguration裏面是什麽樣子的,我在json文件中寫了一個person數組
1、用:運算符的方式獲取想要的數據
我們可以看出,數據是Key,Value類型的,是不是只要我們根據前面的key就可以獲取後面的 Value呢?
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("appSettings.json") .Build(); var info = configuration["person:0:name"]; Console.WriteLine(info); Console.ReadKey(); }
結果:
2、使用GetSection ()方法進行獲取
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("appSettings.json") .Build(); var info = configuration.GetSection("person").GetSection("0").GetSection("name").Value; var info1 = configuration.GetSection("person").GetSection("0")["name"]; Console.WriteLine(info); Console.WriteLine(info1); Console.ReadKey(); }
結果如下:
八、強類型讀取
安裝 Microsoft.Extensions.Configuration.Binder 包
1、GetValue<T>
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("appSettings.json") .Build(); var info = configuration.GetValue<string>("username"); Console.WriteLine(info); Console.ReadKey(); } }
結果如下:
2、Bind()
public class Rootobject { public string username { get; set; } public Person[] person { get; set; } } public class Person { public string id { get; set; } public string name { get; set; } } static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("appSettings.json") .Build(); Rootobject rootobject = new Rootobject(); configuration.Bind(rootobject); Console.WriteLine(rootobject.username); Console.ReadKey(); }
結果如下:
3、Get<T>()
static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("appSettings.json") .Build(); Rootobject rootobject=configuration.Get<Rootobject>(); Console.WriteLine(rootobject.username); Console.ReadKey(); }
結果如下:
那麽Bind()和Get<T>()有什麽區別呢?
通過源碼分析這兩個方法,主要區別在於,Get<T>()方法主要用到了反射,通過反射創建T的一個對象返回
.net core學習筆記《新一代的配置系統Configuration在支持多數據源,熱更新,層級化方面代碼快速實踐》