中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

ASP.NET Core配置教程之讀取配置信息
來源:易賢網(wǎng) 閱讀:973 次 日期:2016-08-09 15:37:17
溫馨提示:易賢網(wǎng)小編為您整理了“ASP.NET Core配置教程之讀取配置信息”,方便廣大網(wǎng)友查閱!

提到“配置”二字,我想絕大部分.NET開發(fā)人員腦海中會立馬浮現(xiàn)出兩個特殊文件的身影,那就是我們再熟悉不過的app.config和web.config,多年以來我們已經(jīng)習(xí)慣了將結(jié)構(gòu)化的配置信息定義在這兩個文件之中。到了.NET Core的時候,很多我們習(xí)以為常的東西都發(fā)生了改變,其中也包括定義配置的方式。總的來說,新的配置系統(tǒng)顯得更加輕量級,并且具有更好的擴展性,其最大的特點就是支持多樣化的數(shù)據(jù)源。我們可以采用內(nèi)存的變量作為配置的數(shù)據(jù)源,也可以直接配置定義在持久化的文件甚至數(shù)據(jù)庫中。

由于很多人都不曾接觸過這個采用全新設(shè)計的配置系統(tǒng),為了讓大家對此有一個感官的認識,我們先從編程的角度對它作一個初體驗。針對配置的API涉及三個對象,它們分別是Configuration、ConfigurationBuilder和ConfigurationProvider,配置模型中具有相應(yīng)的接口來表示它們。這三個對象之間的關(guān)系很清晰,Configuration對象承載著在編程過程中使用的配置信息,ConfigurationProvider則是配置信息原始數(shù)據(jù)源的提供者,兩者之間溝通由ConfigurationBuilder來完成,它利用ConfigurationProvider提取源數(shù)據(jù)將其轉(zhuǎn)換為Configuration對象。

一、以鍵-值對的形式讀取配置

雖然在大部分情況下的配置信息從整體來說都具有一個結(jié)構(gòu)化的層次關(guān)系,但是“原子”配置項都以最簡單的“鍵-值對”的形式來體現(xiàn),并且鍵和值都是字符串,接下來我們會通過一個簡單的實例來演示如何以鍵值對的形式來讀取配置。我們創(chuàng)建一個針對ASP.NET Core的控制臺應(yīng)用,并在project.json中按照如下的方式添加針對“Microsoft.Extensions.Configuration”這個NuGet包的依賴,配置模型就實現(xiàn)在這個包中。

{

  ...

   "dependencies": {

   "Microsoft.Extensions.Configuration": "1.0.0-rc1-final"

  },

 }

假設(shè)我們的應(yīng)用需要通過配置來設(shè)定日期/時間的顯示格式,為此我們定義了如下一個DateTimeFormatSettings類,它的四個屬性體現(xiàn)了DateTime對象的四種顯示格式(分別為長日期/時間和短日期/時間)。

public class DateTimeFormatSettings

 {

    public string LongDatePattern { get; set; }

    public string LongTimePattern { get; set; }

    public string ShortDatePattern { get; set; }

   public string ShortTimePattern { get; set; }

   //其他成員

 }

我們希望通過配置的形式來控制由DateTimeFormatSettings的四個屬性體現(xiàn)的日期/時間顯示格式,所以我們?yōu)樗x了一個構(gòu)造函數(shù)。如下面的代碼片段所示,該構(gòu)造函數(shù)具有一個IConfiguration接口類型的參數(shù),它正式承載相關(guān)配置信息的Configuration對象。我們調(diào)用Configuration對象的索引并指定相應(yīng)配置項的Key來得到其Value。

public class DateTimeFormatSettings

  {

   //其他成員

   public DateTimeFormatSettings (IConfiguration configuration)

    {

      this.LongDatePattern   = configuration["LongDatePattern"];

     this.LongTimePattern   = configuration["LongTimePattern"];

     this.ShortDatePattern  = configuration["ShortDatePattern"];

      this.ShortTimePattern  = configuration["ShortTimePattern"];

   }

 }

要創(chuàng)建一個體現(xiàn)當前配置的DateTimeFormatSettings對象,我們必須向得到這個承載相關(guān)配置信息的Configuration對象。正如我們上面所說,Configuration對象是由ConfigurationBuilder創(chuàng)建的,而原始的配置信息則是通過相應(yīng)的ConfigurationProvider來讀取的,所以創(chuàng)建一個Configuration對象的正確編程方式是先創(chuàng)建一個ConfigurationBuilder對象,然后為之添加一個或者多個ConfigurationProvider對象,最后利用ConfigurationBuilder來創(chuàng)建我們需要的Configuration對象。

按照上述的編程模式,我們在一個控制臺應(yīng)用中編寫了如下的程序。我們創(chuàng)建了一個類型為ConfigurationBuilder的對象,調(diào)用其Add方法添加的ConfigurationProvider是一個類型為MemoryConfigurationProvider的對象。顧名思義,MemoryConfigurationProvider利用內(nèi)存中的對象來提供原始的配置信息,具體來說這些原始的配置信息保存在一個元素類型為KeyValuePair<string, string>的集合之中。我們最終調(diào)用ConfigurationBuilder的Build方法獲取用于創(chuàng)建DateTimeFormatSettings對象所需的Configuration。

public class Program

 {

    public static void Main(string[] args)

    {

      Dictionary<string, string> source = new Dictionary<string, string>

      {

        ["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);

   }

 }

為了驗證根據(jù)配置創(chuàng)建的DateTimeFormatSettings對象與配置原始數(shù)據(jù)之間的關(guān)系,我們將它的四個屬性輸出于控制臺上。當這個程序執(zhí)行之后將在控制臺上產(chǎn)生如下所示的輸出,可以看出它正是我們提供的配置的真實反映。

 LongDatePattern : dddd, MMMM d, yyyy

 LongTimePattern : h:mm:ss tt

 ShortDatePattern: M/d/yyyy

 ShortTimePattern: h:mm tt

二、 讀取結(jié)構(gòu)化的配置

真實項目中涉及的配置大都具有一個結(jié)構(gòu)化的層次結(jié)構(gòu),所以在配置模型中的Configuration對象同樣具有這樣的結(jié)構(gòu)。結(jié)構(gòu)化的配置具有一個樹形層次結(jié)構(gòu),而一個Configuration對象表示的是組成這棵配置樹的某個節(jié)點,這棵配置樹則可以通過作為根節(jié)點的Configuration對象來體現(xiàn)。體現(xiàn)為鍵值對的原子配置項一般至存在于作為葉子節(jié)點的Configuration對象中,非葉子節(jié)點的Configuration包含一組子節(jié)點,而每個子節(jié)點同樣是一個Configuration對象。

接下來我們同樣以實例的方式來演示如何定義并讀取具有層次化結(jié)構(gòu)的配置。我們依然沿用上一節(jié)的應(yīng)用場景,現(xiàn)在我們不僅僅需要設(shè)置日期/時間的格式,還需要設(shè)置其他數(shù)據(jù)類型的格式,比如表示貨幣的Decimal類型。為此我們定義了如下一個CurrencyDecimalFormatSettings類,它的屬性Digits和Symbol分別表示小數(shù)位數(shù)和貨幣符號,一個CurrencyDecimalFormatSettings對象依然是利用一個表示配置的Configuration對象來創(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"];

  }

}

我們定義了另一個名為FormatSettings的類型來表示針對不同數(shù)據(jù)類型的格式設(shè)置。如下面的代碼片段所示,它的兩個屬性DateTime和CurrencyDecimal分別表示針對日期/時間和貨幣數(shù)字的格式設(shè)置。FormatSettings依然具有一個參數(shù)類型為IConfiguration接口的構(gòu)造函數(shù),它的兩個屬性均在此構(gòu)造函數(shù)中被初始化。值得注意的是初始化這兩個屬性采用的是當前Configuration的“子配置節(jié)”,通過指定配置節(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"));

    }

}

在我們上面演示的實例中,我們通過以一個MemoryConfigurationProvider對象來提供原始的配置信息。由于承載原始配置信息的是一個元素類型為KeyValuePair<string, string>的集合,所以原始配置在物理存儲上并不具有樹形化的層次結(jié)構(gòu),那么它如何能夠最終提供一個結(jié)構(gòu)化的Configuration對象呢?其實很簡單,雖然MemoryConfigurationProvider對象只能將配置信息存儲為簡單的“數(shù)據(jù)字典”,但是如果將Configuration對象在配置樹中體現(xiàn)的路徑作為Key,這個數(shù)據(jù)字典在邏輯上實際上就具有了一棵樹的結(jié)構(gòu)。實際上MemoryConfigurationProvider就是這么做的,這體現(xiàn)在我們?nèi)缦滤镜某绦蛑小?/P>

class Program

 {

   static void Main(string[] args)

   {

     Dictionary<string, string> source = new Dictionary<string, string>

     {

       ["Format:DateTime:LongDatePattern"]   = "dddd, MMMM d, yyyy",

       ["Format:DateTime:LongTimePattern"]   = "h:mm:ss tt",

       ["Format:DateTime:ShortDatePattern"]   = "M/d/yyyy",

       ["Format:DateTime:ShortTimePattern"]   = "h:mm tt",

       ["Format:CurrencyDecimal:Digits"]   = "2",

       ["Format:CurrencyDecimal:Symbol"]   = "$",

     };

     IConfiguration configuration = new ConfigurationBuilder()

         .Add(new MemoryConfigurationProvider(source))

         .Build();

     FormatSettings settings = new FormatSettings(configuration.GetSection("Format"));

     Console.WriteLine("DateTime:");

     Console.WriteLine("\t{0,-16}: {1}", "LongDatePattern", settings.DateTime.LongDatePattern);

     Console.WriteLine("\t{0,-16}: {1}", "LongTimePattern", settings.DateTime.LongTimePattern);

     Console.WriteLine("\t{0,-16}: {1}", "ShortDatePattern", settings.DateTime.ShortDatePattern);

     Console.WriteLine("\t{0,-16}: {1}\n", "ShortTimePattern", settings.DateTime.ShortTimePattern);

     Console.WriteLine("CurrencyDecimal:");

     Console.WriteLine("\t{0,-16}: {1}", "Digits", settings.CurrencyDecimal.Digits);

     Console.WriteLine("\t{0,-16}: {1}", "Symbol", settings.CurrencyDecimal.Symbol);

   }

}

如上面的代碼片段所示,創(chuàng)建MemoryConfigurationProvider對象采用的字典對象包含6個基本的配置項,為了讓它們在邏輯上具有一個樹形化層次結(jié)構(gòu),所以的Key實際上體現(xiàn)了每個配置項所在配置節(jié)在配置樹中的路徑,路徑采用冒號(“:”)進行分割。改程序執(zhí)行之后會在控制臺上呈現(xiàn)如下所示的輸出結(jié)果。

DateTime:

    LongDatePattern : dddd, MMMM d, yyyy

    LongTimePattern : h:mm:ss tt

     ShortDatePattern: M/d/yyyy

    ShortTimePattern: h:mm tt

 CurrencyDecimal:

    Digits     : 2

    Symbol     : $

三、將結(jié)構(gòu)化配置直接綁定為對象

在真正的項目開發(fā)過程中,我們都不會直接使用直接讀取的配置,而都傾向于像我們演示的兩個實例一樣通過創(chuàng)建相應(yīng)的類型(比如DateTimeFormatSettings、CurrencyDecimalSettings和FormatSettings)來定義一組相關(guān)的配置選項(Option),我們將定義配置選項(Option)的這些類型稱為Option類型。在上面演示的實例中,為了創(chuàng)建這些封裝配置的對象,我們都是采用手工讀取配置的形式,如果定義的配置項太多的話,逐條讀取配置項其實是一項非常繁瑣的工作。

對于一個對象來說,如果我們將它的屬性視為它的子節(jié)點,一個對象同樣具有類似于Configuration對象的樹形層次化結(jié)構(gòu)。如果我們根據(jù)某個Option類型的結(jié)構(gòu)來定義配置,或者反過來根據(jù)配置的結(jié)構(gòu)來定義這個Option類型,那么Option類型的屬性成員將與某個配置節(jié)具有一一對應(yīng)的關(guān)系,那么原則上我們可以自動將配置信息綁定為一個具體的Option對象。

ASP.NET Core針對配置的Option模型(OptionModel)幫助我們實現(xiàn)了從配置到Option對象之間的綁定,接下來我們就對此做一個簡單的演示。Option模型實現(xiàn)在“Microsoft.Extensions.OptionModel”這個NuGet包中,除此之外,我們需要采用依賴注入的方式來使用Option模型,所以我們需要按照如下的方式為應(yīng)用添加針對相應(yīng)的依賴。

{

 ...

 "dependencies": {

 "Microsoft.Extensions.OptionsModel"    : "1.0.0-rc1-final",

 "Microsoft.Extensions.DependencyInjection"  : "1.0.0-rc1-final"

 },

}

借助于Option模型的自動綁定機制,我們無需再手工地讀取配置信息,所以我們將FormatSettings、DateTimeFormatSettings和CurrencyDecimalSettings的構(gòu)造函數(shù)刪除,只保留其屬性成員。在作為程序入口的Main方法中,我們采用如下的方式創(chuàng)建這個表示格式設(shè)置的FormatSettings對象。

class Program

{

   static void Main(string[] args)

   {

     Dictionary<string, string> source = new Dictionary<string, string>

     {

      ["Format:DateTime:LongDatePattern"] = "dddd, MMMM d, yyyy",

      ["Format:DateTime:LongTimePattern"] = "h:mm:ss tt",

      ["Format:DateTime:ShortDatePattern"] = "M/d/yyyy",

       ["Format:DateTime:ShortTimePattern"] = "h:mm tt",

       ["Format:CurrencyDecimal:Digits"] = "2",

       ["Format:CurrencyDecimal:Symbol"] = "$",

    };

    IConfiguration configuration = new ConfigurationBuilder()

         .Add(new MemoryConfigurationProvider(source))

         .Build()

         .GetSection("Format"));

     IOptions<FormatSettings> optionsAccessor = new ServiceCollection()

       .AddOptions()

       .Configure<FormatSettings>(configuration)

      .BuildServiceProvider()

      .GetService<IOptions<FormatSettings>>();

    FormatSettings settings = optionsAccessor.Value;

     Console.WriteLine("DateTime:");

     Console.WriteLine("\t{0,-16}: {1}", "LongDatePattern",settings.DateTime.LongDatePattern);

     Console.WriteLine("\t{0,-16}: {1}", "LongTimePattern",settings.DateTime.LongTimePattern);

     Console.WriteLine("\t{0,-16}: {1}", "ShortDatePattern",settings.DateTime.ShortDatePattern);

     Console.WriteLine("\t{0,-16}: {1}\n", "ShortTimePattern",settings.DateTime.ShortTimePattern);

     Console.WriteLine("CurrencyDecimal:");

     Console.WriteLine("\t{0,-16}: {1}", "Digits",settings.CurrencyDecimal.Digits);

     Console.WriteLine("\t{0,-16}: {1}", "Symbol",settings.CurrencyDecimal.Symbol);

   }

 }

如上面的代碼片段所示,我們創(chuàng)建一個ServiceCollection對象并調(diào)用擴展方法AddOptions注冊于針對Option模型的服務(wù)。接下來我們調(diào)用Configure方法將FormatSettings這個Option類型與對應(yīng)的Configuration對象進行映射。我們最后利用這個ServiceCollection對象生成一個ServiceProvider,并調(diào)用其GetService方法得到一個類型為IOptions<FormatSettings>的對象,后者的Value屬性返回的就是綁定了相關(guān)配置的FormatSettings對象。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機網(wǎng)站地址:ASP.NET Core配置教程之讀取配置信息
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權(quán)所有:易賢網(wǎng)

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲午夜久久久久| 欧美午夜精品一区| 免费观看在线综合色| 亚洲国产视频在线| 日韩一区在线免费观看| 国产精品毛片久久久久久| 中文字幕第一区| 亚洲欧美在线aaa| 亚洲免费观看高清完整版在线观看熊| 国产精品天天摸av网| 亚洲人成影院在线观看| 亚洲一区二区三区四区中文字幕| 同产精品九九九| 麻豆专区一区二区三区四区五区| 激情伊人五月天久久综合| 国产成人av资源| 91麻豆蜜桃一区二区三区| 欧美人xxxx| 久久久久久黄色| 亚洲欧洲综合另类在线| 亚洲.国产.中文慕字在线| 久久国内精品自在自线400部| 久久国产精品99久久久久久老狼| 国产美女在线观看一区| 色婷婷综合久久久中文一区二区| 欧美精品一卡两卡| 国产精品视频在线看| 亚洲第一激情av| 国产精品一线二线三线| 色婷婷综合久色| 精品国产乱码久久久久久闺蜜 | 天堂蜜桃91精品| 韩国精品一区二区| 91激情在线视频| 日韩欧美中文一区二区| 国产精品久久久一本精品| 三级不卡在线观看| 99亚偷拍自图区亚洲| 欧美一区二视频| 亚洲男同性恋视频| 狠狠色丁香久久婷婷综合_中| 色94色欧美sute亚洲13| 欧美不卡一二三| 一区二区免费在线播放| 国产乱子伦视频一区二区三区| 欧美色老头old∨ideo| 国产日韩亚洲欧美综合| 奇米影视7777精品一区二区| 一本色道综合亚洲| 国产肉丝袜一区二区| 蜜臀久久99精品久久久画质超高清 | 欧美一区日韩一区| 亚洲欧美一区二区久久 | 亚洲黄色小说网站| 国产激情91久久精品导航| 欧美高清一级片在线| 成人免费在线播放视频| 国产一区二区三区免费播放| 制服丝袜亚洲色图| 亚洲综合色婷婷| 99视频有精品| 中文字幕亚洲精品在线观看| 国产成人亚洲综合色影视| 欧美电视剧在线看免费| 亚洲18女电影在线观看| 91免费视频网址| 亚洲欧洲成人av每日更新| 国产成人在线影院| 国产精品网友自拍| caoporn国产精品| 中文字幕在线观看一区二区| 成人丝袜18视频在线观看| 国产欧美一区二区精品婷婷| 奇米色777欧美一区二区| 日韩亚洲欧美一区二区三区| 日韩在线卡一卡二| 日韩女优毛片在线| 激情综合网av| 中文字幕二三区不卡| 成人h精品动漫一区二区三区| 国产精品亲子伦对白| 一本大道久久a久久综合| 亚洲综合色在线| 欧美高清视频一二三区 | 日韩一区二区三区免费看| 免费成人性网站| 337p日本欧洲亚洲大胆精品| 国产一区二区伦理| 亚洲欧洲成人av每日更新| 色屁屁一区二区| 爽好多水快深点欧美视频| 欧美xxxx老人做受| 99在线精品免费| 日韩制服丝袜av| 久久久99久久精品欧美| 波多野结衣在线一区| 亚洲一区二区三区免费视频| 日韩午夜精品电影| 不卡一区二区在线| 视频一区免费在线观看| 精品电影一区二区三区| 99国产精品99久久久久久| 日韩电影免费在线观看网站| 国产亚洲一二三区| 欧美日韩黄色一区二区| 国产乱理伦片在线观看夜一区| 国产精品精品国产色婷婷| 91精选在线观看| www.亚洲色图| 精品一区二区三区久久| 亚洲欧美激情小说另类| 欧美不卡在线视频| 色菇凉天天综合网| 黄页网站大全一区二区| 一区二区三区在线视频免费观看| 日韩免费视频线观看| 91国产成人在线| 国产一区在线看| 婷婷亚洲久悠悠色悠在线播放| 国产人久久人人人人爽| 日韩区在线观看| 欧美视频精品在线观看| 99精品热视频| 国产福利一区二区| 日韩国产欧美一区二区三区| 亚洲免费在线看| 中文字幕免费不卡在线| 久久婷婷成人综合色| 欧美一级片免费看| 欧美在线|欧美| 99国产麻豆精品| 国产a级毛片一区| 国产一区二区三区视频在线播放| 五月婷婷激情综合网| 亚洲色图清纯唯美| 中文字幕制服丝袜一区二区三区 | 综合电影一区二区三区| 久久这里只有精品视频网| 91精品国产综合久久精品图片| 91成人在线精品| 91啪亚洲精品| 色哟哟亚洲精品| 日本韩国精品一区二区在线观看| 成人免费毛片片v| 成人网在线免费视频| 国产成人精品免费视频网站| 狠狠色丁香久久婷婷综合_中| 麻豆freexxxx性91精品| 久久99国内精品| 国产精品456露脸| 国产高清亚洲一区| 成人综合婷婷国产精品久久免费| 国产乱码一区二区三区| 高清在线不卡av| www.欧美亚洲| 色猫猫国产区一区二在线视频| 日本乱人伦aⅴ精品| 欧美午夜精品一区二区三区| 欧美男人的天堂一二区| 欧美一区二区三区电影| 欧美成人精品3d动漫h| 国产午夜精品久久久久久免费视| 国产午夜精品久久久久久久 | 91麻豆精品国产91久久久久久| 欧美电影一区二区| 精品国精品国产| 日本一区二区三级电影在线观看| 中文字幕成人网| 亚洲黄色片在线观看| 免费在线看成人av| 国产a区久久久| 欧洲国内综合视频| 日韩欧美国产高清| 自拍偷自拍亚洲精品播放| 亚洲国产精品久久久久婷婷884 | 亚洲最色的网站| 麻豆精品在线看| av成人免费在线| 欧美日韩国产另类不卡| 国产日韩三级在线| 五月天视频一区| 福利91精品一区二区三区| 欧美性色欧美a在线播放| 精品播放一区二区| 亚洲一级二级三级在线免费观看| 免费成人在线观看| 91老司机福利 在线| 日韩欧美一区二区久久婷婷| 亚洲欧洲av另类| 久久99久国产精品黄毛片色诱| 色综合天天综合网国产成人综合天 | 一区二区三区四区视频精品免费| 秋霞午夜鲁丝一区二区老狼| 成人国产精品免费| 精品国内二区三区| 午夜精品在线看| va亚洲va日韩不卡在线观看| 精品日韩av一区二区| 亚洲福利一区二区三区| 成人免费毛片嘿嘿连载视频|