.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的一個對象返回


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM