<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        ASP.NET Core配置教程之讀取配置信息

        來源:懂視網 責編:小采 時間:2020-11-27 22:37:44
        文檔

        ASP.NET Core配置教程之讀取配置信息

        ASP.NET Core配置教程之讀取配置信息:提到配置二字,我想絕大部分.NET開發人員腦海中會立馬浮現出兩個特殊文件的身影,那就是我們再熟悉不過的app.config和web.config,多年以來我們已經習慣了將結構化的配置信息定義在這兩個文件之中。到了.NET Core的時候,很多我們習以為常的東西都發生了
        推薦度:
        導讀ASP.NET Core配置教程之讀取配置信息:提到配置二字,我想絕大部分.NET開發人員腦海中會立馬浮現出兩個特殊文件的身影,那就是我們再熟悉不過的app.config和web.config,多年以來我們已經習慣了將結構化的配置信息定義在這兩個文件之中。到了.NET Core的時候,很多我們習以為常的東西都發生了

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

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

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

        {
         ...
         "dependencies": {
         "Microsoft.Extensions.Configuration": "1.0.0-rc1-final"
         },
         }

        假設我們的應用需要通過配置來設定日期/時間的顯示格式,為此我們定義了如下一個DateTimeFormatSettings類,它的四個屬性體現了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的四個屬性體現的日期/時間顯示格式,所以我們為它定義了一個構造函數。如下面的代碼片段所示,該構造函數具有一個IConfiguration接口類型的參數,它正式承載相關配置信息的Configuration對象。我們調用Configuration對象的索引并指定相應配置項的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"];
         }
         }
        

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

        按照上述的編程模式,我們在一個控制臺應用中編寫了如下的程序。我們創建了一個類型為ConfigurationBuilder的對象,調用其Add方法添加的ConfigurationProvider是一個類型為MemoryConfigurationProvider的對象。顧名思義,MemoryConfigurationProvider利用內存中的對象來提供原始的配置信息,具體來說這些原始的配置信息保存在一個元素類型為KeyValuePair<string, string>的集合之中。我們最終調用ConfigurationBuilder的Build方法獲取用于創建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);
         }
         }

        為了驗證根據配置創建的DateTimeFormatSettings對象與配置原始數據之間的關系,我們將它的四個屬性輸出于控制臺上。當這個程序執行之后將在控制臺上產生如下所示的輸出,可以看出它正是我們提供的配置的真實反映。
         LongDatePattern : dddd, MMMM d, yyyy
         LongTimePattern : h:mm:ss tt
         ShortDatePattern: M/d/yyyy
         ShortTimePattern: h:mm tt

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

        接下來我們同樣以實例的方式來演示如何定義并讀取具有層次化結構的配置。我們依然沿用上一節的應用場景,現在我們不僅僅需要設置日期/時間的格式,還需要設置其他數據類型的格式,比如表示貨幣的Decimal類型。為此我們定義了如下一個CurrencyDecimalFormatSettings類,它的屬性Digits和Symbol分別表示小數位數和貨幣符號,一個CurrencyDecimalFormatSettings對象依然是利用一個表示配置的Configuration對象來創建的。

         {
         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的類型來表示針對不同數據類型的格式設置。如下面的代碼片段所示,它的兩個屬性DateTime和CurrencyDecimal分別表示針對日期/時間和貨幣數字的格式設置。FormatSettings依然具有一個參數類型為IConfiguration接口的構造函數,它的兩個屬性均在此構造函數中被初始化。值得注意的是初始化這兩個屬性采用的是當前Configuration的“子配置節”,通過指定配置節名稱調用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>的集合,所以原始配置在物理存儲上并不具有樹形化的層次結構,那么它如何能夠最終提供一個結構化的Configuration對象呢?其實很簡單,雖然MemoryConfigurationProvider對象只能將配置信息存儲為簡單的“數據字典”,但是如果將Configuration對象在配置樹中體現的路徑作為Key,這個數據字典在邏輯上實際上就具有了一棵樹的結構。實際上MemoryConfigurationProvider就是這么做的,這體現在我們如下所示的程序之中。

        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);
         }
        }

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

        DateTime:
         LongDatePattern : dddd, MMMM d, yyyy
         LongTimePattern : h:mm:ss tt
         ShortDatePattern: M/d/yyyy
         ShortTimePattern: h:mm tt
         
         CurrencyDecimal:
         Digits : 2
         Symbol : $

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

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

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

         {
         ...
         "dependencies": {
         "Microsoft.Extensions.OptionsModel" : "1.0.0-rc1-final",
         "Microsoft.Extensions.DependencyInjection" : "1.0.0-rc1-final"
         },
         }

        借助于Option模型的自動綁定機制,我們無需再手工地讀取配置信息,所以我們將FormatSettings、DateTimeFormatSettings和CurrencyDecimalSettings的構造函數刪除,只保留其屬性成員。在作為程序入口的Main方法中,我們采用如下的方式創建這個表示格式設置的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);
         }
         }
        

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

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        ASP.NET Core配置教程之讀取配置信息

        ASP.NET Core配置教程之讀取配置信息:提到配置二字,我想絕大部分.NET開發人員腦海中會立馬浮現出兩個特殊文件的身影,那就是我們再熟悉不過的app.config和web.config,多年以來我們已經習慣了將結構化的配置信息定義在這兩個文件之中。到了.NET Core的時候,很多我們習以為常的東西都發生了
        推薦度:
        標簽: 信息 步驟 方法
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本亚洲欧洲免费天堂午夜看片女人员 | 亚洲一级Av无码毛片久久精品| 亚洲国产精品自产在线播放| 最新亚洲成av人免费看| 久久亚洲AV成人无码| 日韩欧美亚洲国产精品字幕久久久 | 亚洲国产精品无码成人片久久| 国产美女视频免费观看的网站| 91免费国产精品| 免费一级毛片在线播放不收费| 亚洲AV永久无码精品| 亚洲AV性色在线观看| 精品国产免费一区二区| 久久久亚洲精品国产| 亚洲第一第二第三第四第五第六| 99精品免费视品| 四虎影院免费视频| 久久亚洲精品中文字幕无码| 暖暖免费日本在线中文| 四只虎免费永久观看| 亚洲午夜在线一区| 国产精品免费AV片在线观看| 亚洲最新永久在线观看| 国产一级婬片A视频免费观看| 成人免费视频国产| 亚洲国产精品成人综合色在线婷婷| 中文字幕在线免费看| 亚洲久本草在线中文字幕| a级毛片视频免费观看| 麻豆亚洲av熟女国产一区二| 毛片A级毛片免费播放| 久久亚洲AV成人无码| 免费电视剧在线观看| 亚洲卡一卡2卡三卡4麻豆| 午夜寂寞在线一级观看免费| 羞羞漫画小舞被黄漫免费| 午夜爱爱免费视频| 一级有奶水毛片免费看| 亚洲一级毛片中文字幕| 亚洲精品免费在线视频| 亚洲酒色1314狠狠做|