新聞中心
ASP.NET Core中怎么讀取配置信息,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
一、以鍵-值對(duì)的形式讀取配置
雖然在大部分情況下的配置信息從整體來(lái)說(shuō)都具有一個(gè)結(jié)構(gòu)化的層次關(guān)系,但是“原子”配置項(xiàng)都以最簡(jiǎn)單的“鍵-值對(duì)”的形式來(lái)體現(xiàn),并且鍵和值都是字符串,接下來(lái)我們會(huì)通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)演示如何以鍵值對(duì)的形式來(lái)讀取配置。我們創(chuàng)建一個(gè)針對(duì)ASP.NET Core的控制臺(tái)應(yīng)用,并在project.json中按照如下的方式添加針對(duì)“Microsoft.Extensions.Configuration”這個(gè)NuGet包的依賴,配置模型就實(shí)現(xiàn)在這個(gè)包中。
{ ... "dependencies": { "Microsoft.Extensions.Configuration": "1.0.0-rc1-final" }, }
假設(shè)我們的應(yīng)用需要通過(guò)配置來(lái)設(shè)定日期/時(shí)間的顯示格式,為此我們定義了如下一個(gè)DateTimeFormatSettings類(lèi),它的四個(gè)屬性體現(xiàn)了DateTime對(duì)象的四種顯示格式(分別為長(zhǎng)日期/時(shí)間和短日期/時(shí)間)。
public class DateTimeFormatSettings { public string LongDatePattern { get; set; } public string LongTimePattern { get; set; } public string ShortDatePattern { get; set; } public string ShortTimePattern { get; set; } //其他成員 }
我們希望通過(guò)配置的形式來(lái)控制由DateTimeFormatSettings的四個(gè)屬性體現(xiàn)的日期/時(shí)間顯示格式,所以我們?yōu)樗x了一個(gè)構(gòu)造函數(shù)。如下面的代碼片段所示,該構(gòu)造函數(shù)具有一個(gè)IConfiguration接口類(lèi)型的參數(shù),它正式承載相關(guān)配置信息的Configuration對(duì)象。我們調(diào)用Configuration對(duì)象的索引并指定相應(yīng)配置項(xiàng)的Key來(lái)得到其Value。
public class DateTimeFormatSettings { //其他成員 public DateTimeFormatSettings (IConfiguration configuration) { this.LongDatePattern = configuration["LongDatePattern"]; this.LongTimePattern = configuration["LongTimePattern"]; this.ShortDatePattern = configuration["ShortDatePattern"]; this.ShortTimePattern = configuration["ShortTimePattern"]; } }
要?jiǎng)?chuàng)建一個(gè)體現(xiàn)當(dāng)前配置的DateTimeFormatSettings對(duì)象,我們必須向得到這個(gè)承載相關(guān)配置信息的Configuration對(duì)象。正如我們上面所說(shuō),Configuration對(duì)象是由ConfigurationBuilder創(chuàng)建的,而原始的配置信息則是通過(guò)相應(yīng)的ConfigurationProvider來(lái)讀取的,所以創(chuàng)建一個(gè)Configuration對(duì)象的正確編程方式是先創(chuàng)建一個(gè)ConfigurationBuilder對(duì)象,然后為之添加一個(gè)或者多個(gè)ConfigurationProvider對(duì)象,最后利用ConfigurationBuilder來(lái)創(chuàng)建我們需要的Configuration對(duì)象。
按照上述的編程模式,我們?cè)谝粋€(gè)控制臺(tái)應(yīng)用中編寫(xiě)了如下的程序。我們創(chuàng)建了一個(gè)類(lèi)型為ConfigurationBuilder的對(duì)象,調(diào)用其Add方法添加的ConfigurationProvider是一個(gè)類(lèi)型為MemoryConfigurationProvider的對(duì)象。顧名思義,MemoryConfigurationProvider利用內(nèi)存中的對(duì)象來(lái)提供原始的配置信息,具體來(lái)說(shuō)這些原始的配置信息保存在一個(gè)元素類(lèi)型為KeyValuePair
public class Program { public static void Main(string[] args) { Dictionarysource = new Dictionary { ["LongDatePattern"] = "dddd, MMMM d, yyyy", ["LongTimePattern"] = "h:mm:ss tt", ["ShortDatePattern"] = "M/d/yyyy", ["ShortTimePattern"] = "h:mm tt" }; IConfiguration configuration = new ConfigurationBuilder() .Add(new MemoryConfigurationProvider(source)) .Build(); DateTimeFormatSettings settings = new DateTimeFormatSettings(configuration); Console.WriteLine("{0,-16}: {1}", "LongDatePattern", settings.LongDatePattern); Console.WriteLine("{0,-16}: {1}", "LongTimePattern", settings.LongTimePattern); Console.WriteLine("{0,-16}: {1}", "ShortDatePattern", settings.ShortDatePattern); Console.WriteLine("{0,-16}: {1}", "ShortTimePattern", settings.ShortTimePattern); } }
為了驗(yàn)證根據(jù)配置創(chuàng)建的DateTimeFormatSettings對(duì)象與配置原始數(shù)據(jù)之間的關(guān)系,我們將它的四個(gè)屬性輸出于控制臺(tái)上。當(dāng)這個(gè)程序執(zhí)行之后將在控制臺(tái)上產(chǎn)生如下所示的輸出,可以看出它正是我們提供的配置的真實(shí)反映。
LongDatePattern : dddd, MMMM d, yyyy
LongTimePattern : h:mm:ss tt
ShortDatePattern: M/d/yyyy
ShortTimePattern: h:mm tt
二、 讀取結(jié)構(gòu)化的配置
真實(shí)項(xiàng)目中涉及的配置大都具有一個(gè)結(jié)構(gòu)化的層次結(jié)構(gòu),所以在配置模型中的Configuration對(duì)象同樣具有這樣的結(jié)構(gòu)。結(jié)構(gòu)化的配置具有一個(gè)樹(shù)形層次結(jié)構(gòu),而一個(gè)Configuration對(duì)象表示的是組成這棵配置樹(shù)的某個(gè)節(jié)點(diǎn),這棵配置樹(shù)則可以通過(guò)作為根節(jié)點(diǎn)的Configuration對(duì)象來(lái)體現(xiàn)。體現(xiàn)為鍵值對(duì)的原子配置項(xiàng)一般至存在于作為葉子節(jié)點(diǎn)的Configuration對(duì)象中,非葉子節(jié)點(diǎn)的Configuration包含一組子節(jié)點(diǎn),而每個(gè)子節(jié)點(diǎn)同樣是一個(gè)Configuration對(duì)象。
接下來(lái)我們同樣以實(shí)例的方式來(lái)演示如何定義并讀取具有層次化結(jié)構(gòu)的配置。我們依然沿用上一節(jié)的應(yīng)用場(chǎng)景,現(xiàn)在我們不僅僅需要設(shè)置日期/時(shí)間的格式,還需要設(shè)置其他數(shù)據(jù)類(lèi)型的格式,比如表示貨幣的Decimal類(lèi)型。為此我們定義了如下一個(gè)CurrencyDecimalFormatSettings類(lèi),它的屬性Digits和Symbol分別表示小數(shù)位數(shù)和貨幣符號(hào),一個(gè)CurrencyDecimalFormatSettings對(duì)象依然是利用一個(gè)表示配置的Configuration對(duì)象來(lái)創(chuàng)建的。
{ public int Digits { get; set; } public string Symbol { get; set; } public CurrencyDecimalFormatSettings(IConfiguration configuration) { this.Digits = int.Parse(configuration["Digits"]); this.Symbol = configuration["Symbol"]; } }
我們定義了另一個(gè)名為FormatSettings的類(lèi)型來(lái)表示針對(duì)不同數(shù)據(jù)類(lèi)型的格式設(shè)置。如下面的代碼片段所示,它的兩個(gè)屬性DateTime和CurrencyDecimal分別表示針對(duì)日期/時(shí)間和貨幣數(shù)字的格式設(shè)置。FormatSettings依然具有一個(gè)參數(shù)類(lèi)型為IConfiguration接口的構(gòu)造函數(shù),它的兩個(gè)屬性均在此構(gòu)造函數(shù)中被初始化。值得注意的是初始化這兩個(gè)屬性采用的是當(dāng)前Configuration的“子配置節(jié)”,通過(guò)指定配置節(jié)名稱調(diào)用GetSection方法獲得。
public class FormatSettings { public DateTimeFormatSettings DateTime { get; set; } public CurrencyDecimalFormatSettings CurrencyDecimal { get; set; } public FormatSettings(IConfiguration configuration) { this.DateTime = new DateTimeFormatSettings(configuration.GetSection("DateTime")); this.CurrencyDecimal = new CurrencyDecimalFormatSettings(configuration.GetSection("CurrencyDecimal")); } }
在我們上面演示的實(shí)例中,我們通過(guò)以一個(gè)MemoryConfigurationProvider對(duì)象來(lái)提供原始的配置信息。由于承載原始配置信息的是一個(gè)元素類(lèi)型為KeyValuePair 如上面的代碼片段所示,創(chuàng)建MemoryConfigurationProvider對(duì)象采用的字典對(duì)象包含6個(gè)基本的配置項(xiàng),為了讓它們?cè)谶壿嬌暇哂幸粋€(gè)樹(shù)形化層次結(jié)構(gòu),所以的Key實(shí)際上體現(xiàn)了每個(gè)配置項(xiàng)所在配置節(jié)在配置樹(shù)中的路徑,路徑采用冒號(hào)(“:”)進(jìn)行分割。改程序執(zhí)行之后會(huì)在控制臺(tái)上呈現(xiàn)如下所示的輸出結(jié)果。 三、將結(jié)構(gòu)化配置直接綁定為對(duì)象 對(duì)于一個(gè)對(duì)象來(lái)說(shuō),如果我們將它的屬性視為它的子節(jié)點(diǎn),一個(gè)對(duì)象同樣具有類(lèi)似于Configuration對(duì)象的樹(shù)形層次化結(jié)構(gòu)。如果我們根據(jù)某個(gè)Option類(lèi)型的結(jié)構(gòu)來(lái)定義配置,或者反過(guò)來(lái)根據(jù)配置的結(jié)構(gòu)來(lái)定義這個(gè)Option類(lèi)型,那么Option類(lèi)型的屬性成員將與某個(gè)配置節(jié)具有一一對(duì)應(yīng)的關(guān)系,那么原則上我們可以自動(dòng)將配置信息綁定為一個(gè)具體的Option對(duì)象。 ASP.NET Core針對(duì)配置的Option模型(OptionModel)幫助我們實(shí)現(xiàn)了從配置到Option對(duì)象之間的綁定,接下來(lái)我們就對(duì)此做一個(gè)簡(jiǎn)單的演示。Option模型實(shí)現(xiàn)在“Microsoft.Extensions.OptionModel”這個(gè)NuGet包中,除此之外,我們需要采用依賴注入的方式來(lái)使用Option模型,所以我們需要按照如下的方式為應(yīng)用添加針對(duì)相應(yīng)的依賴。 借助于Option模型的自動(dòng)綁定機(jī)制,我們無(wú)需再手工地讀取配置信息,所以我們將FormatSettings、DateTimeFormatSettings和CurrencyDecimalSettings的構(gòu)造函數(shù)刪除,只保留其屬性成員。在作為程序入口的Main方法中,我們采用如下的方式創(chuàng)建這個(gè)表示格式設(shè)置的FormatSettings對(duì)象。 如上面的代碼片段所示,我們創(chuàng)建一個(gè)ServiceCollection對(duì)象并調(diào)用擴(kuò)展方法AddOptions注冊(cè)于針對(duì)Option模型的服務(wù)。接下來(lái)我們調(diào)用Configure方法將FormatSettings這個(gè)Option類(lèi)型與對(duì)應(yīng)的Configuration對(duì)象進(jìn)行映射。我們最后利用這個(gè)ServiceCollection對(duì)象生成一個(gè)ServiceProvider,并調(diào)用其GetService方法得到一個(gè)類(lèi)型為IOptions 看完上述內(nèi)容,你們掌握ASP.NET Core中怎么讀取配置信息的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!class Program
{
static void Main(string[] args)
{
Dictionary
DateTime:
LongDatePattern : dddd, MMMM d, yyyy
LongTimePattern : h:mm:ss tt
ShortDatePattern: M/d/yyyy
ShortTimePattern: h:mm tt
CurrencyDecimal:
Digits : 2
Symbol : $
在真正的項(xiàng)目開(kāi)發(fā)過(guò)程中,我們都不會(huì)直接使用直接讀取的配置,而都傾向于像我們演示的兩個(gè)實(shí)例一樣通過(guò)創(chuàng)建相應(yīng)的類(lèi)型(比如DateTimeFormatSettings、CurrencyDecimalSettings和FormatSettings)來(lái)定義一組相關(guān)的配置選項(xiàng)(Option),我們將定義配置選項(xiàng)(Option)的這些類(lèi)型稱為Option類(lèi)型。在上面演示的實(shí)例中,為了創(chuàng)建這些封裝配置的對(duì)象,我們都是采用手工讀取配置的形式,如果定義的配置項(xiàng)太多的話,逐條讀取配置項(xiàng)其實(shí)是一項(xiàng)非常繁瑣的工作。 {
...
"dependencies": {
"Microsoft.Extensions.OptionsModel" : "1.0.0-rc1-final",
"Microsoft.Extensions.DependencyInjection" : "1.0.0-rc1-final"
},
}
class Program
{
static void Main(string[] args)
{
Dictionary
當(dāng)前文章:ASP.NETCore中怎么讀取配置信息-創(chuàng)新互聯(lián)
文章分享:http://fisionsoft.com.cn/article/gdhje.html