内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

ASP.NETCore中怎么讀取配置信息-創(chuàng)新互聯(lián)

ASP.NET Core中怎么讀取配置信息,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都創(chuàng)新互聯(lián)成立十載來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計、域名注冊、網(wǎng)絡(luò)營銷、VI設(shè)計、網(wǎng)站改版、漏洞修補等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗好、性價比高、打開快等等,這些對于網(wǎng)站建設(shè)都非常重要,成都創(chuàng)新互聯(lián)通過對建站技術(shù)性的掌握、對創(chuàng)意設(shè)計的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。

一、以鍵-值對的形式讀取配置
雖然在大部分情況下的配置信息從整體來說都具有一個結(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)當(dāng)前配置的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)系,我們將它的四個屬性輸出于控制臺上。當(dāng)這個程序執(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ù)中被初始化。值得注意的是初始化這兩個屬性采用的是當(dāng)前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é)在配置樹中的路徑,路徑采用冒號(“:”)進(jìn)行分割。改程序執(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模型的自動綁定機(jī)制,我們無需再手工地讀取配置信息,所以我們將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)用擴(kuò)展方法AddOptions注冊于針對Option模型的服務(wù)。接下來我們調(diào)用Configure方法將FormatSettings這個Option類型與對應(yīng)的Configuration對象進(jìn)行映射。我們最后利用這個ServiceCollection對象生成一個ServiceProvider,并調(diào)用其GetService方法得到一個類型為IOptions<FormatSettings>的對象,后者的Value屬性返回的就是綁定了相關(guān)配置的FormatSettings對象。

看完上述內(nèi)容,你們掌握ASP.NET Core中怎么讀取配置信息的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享標(biāo)題:ASP.NETCore中怎么讀取配置信息-創(chuàng)新互聯(lián)
文章來源:http://www.rwnh.cn/article24/gdhje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站營銷建站公司、網(wǎng)站設(shè)計公司、自適應(yīng)網(wǎng)站品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
厦门市| 山东省| 康保县| 东乡族自治县| 兰州市| 岢岚县| 井研县| 个旧市| 玉树县| 滁州市| 苍山县| 调兵山市| 五华县| 新余市| 镇沅| 太仓市| 高台县| 封丘县| 韶关市| 利川市| 建德市| 芦山县| 铁岭县| 凤翔县| 邛崃市| 龙门县| 潮州市| 城固县| 宁津县| 息烽县| 陕西省| 衡东县| 阿克陶县| 南阳市| 舟山市| 武汉市| 汝城县| 扶沟县| 磐石市| 西丰县| 株洲县|