1. 程式人生 > >.net core學習筆記《新一代的配置系統Configuration在支持多數據源,熱更新,層級化方面代碼快速實踐》

.net core學習筆記《新一代的配置系統Configuration在支持多數據源,熱更新,層級化方面代碼快速實踐》

配置文件 stat variables ack lec 復制 image onf sof

在我們之前.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在支持多數據源,熱更新,層級化方面代碼快速實踐》