日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

揭开.NET 2.0配置之谜(一)

發布時間:2023/12/10 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 揭开.NET 2.0配置之谜(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2010-03-20 15:33 by 吳秦, 4828 閱讀, 20 評論, 收藏, 編輯

此文是譯文,原文是Jon Rista,Unraveling the Mysteries of .NET 2.0 Configuration,由于這篇文章比較長,所以我就分為幾部分來翻譯。

以前沒有翻譯過外文,看英文文章倒是也看得懂,現在才發現要翻譯出來,而且質量要過關還是挺難的(對我來說)。若翻譯有不當之處,請不吝賜教,以免此譯文誤導他人,在此謝過。不廢話了,let's start!

致謝:560889223,他幫忙解釋了population的翻譯問題!

引言

.NET的美妙特點之一是它的XML配置功能。在.NET 1.x時代,常見的應用程設置、數據庫連接字符串、ASP.NET Web服務器配置和基本的自定義配置數據可以存儲在.config文件中。自定義配置節可以使用一些基本自定義結構,允許少數幾種信息存儲在.config文件中。然而更復雜的配置,最常見的實現是自定義XML結構和自定義解析代碼。盡管有多種不同性能的方法完成同樣的事情,這種代碼將變得相當復雜。

隨著.NET 2.0,自己編寫(可能很復雜、低性能、繁瑣)代碼來管理自定義XML配置結構的時代已經結束了。.NET 2.0內置的XML配置子系統自定義配置能力已經大大革新,擁有一些非常有用的和節省時間的功能。幾乎任何XML配置結構你可能需要相對更少的工作且更容易。此外,反序列化.config中的XML總是可以重載的。這使得任何XML結構可以不失去.NET 2.0配置支持的其它高級功能。

該系列

這是該系列的第一篇文章。開始使用.NET 2.0所要求的所有核心概念和知識點都在這第一篇文章中提供。但是,.NET 2.0可用的配置框架是廣泛的。從本文可以看到,它有許多功能和一些隱藏功能,可以填補框架的空白和疏漏。要繼續學習有關.NET 2.0的配置框架,其它文章可以在以下鏈接找到:

  • 揭開.NET 2.0配置之謎
  • 解碼.NET 2.0配置之謎
  • 破解.NET 2.0配置之謎
  • 寫此系列的緣由(The mystery)

    在略微超過一年的時間里我一直在使用.NET 2.0,可悲的是,我花了許多不眠之夜去修修補補自定義配置模型。自定義XML配置處理不斷持續的性能下降,每個應用程序需要一個新的模型,這依賴于配置是如何存儲的以及如何需要訪問(從哪里)。直到8個月前左右,我用Reflector鑿開.NET 2.0框架的一些程序集,我遇到一個奇妙的小類:System.Configuration.ConfigurationSection。挖掘更深一點,我發現為數眾多的框架類都繼承自ConfigurationSection和一些其它的類。自那時起,我花了幾個不眠之夜吸收盡可能多的.NET 2.0的新配置特性。

    我只想說,在互聯網上關于自定義配置節的真正能力的資料非常少。通過Internet搜索、數小時的用Reflector研究框架代碼、持續的實驗和用自定義配置節,我終于知道了我需要知道的。這是生命的救星。最終,能輕松容易地創建和管理自定義XML配置、簡單易用、易于管理并且性能優越……我將在與大家分享這個圣杯。我要求的唯一回報就是讓任何人和你認識的用.config文件的人——他們應該更好地寫.NET代碼,看到這篇文章從而節省通過數個月的挖掘代碼、互聯網論壇和博客來學習它。

    有關配置的主題

    本文的目標是覆蓋所有的.NET 2.0的配置,以及揭露一些更嚴密保護的秘密(標注:無正式文檔的,無事實證明的…種種原因),可以節省你大量的時間和麻煩。首先,我們總覽核心命名空間,它揭露了所有的自定義配置瘋狂之處。然后,我們將進入具體執行和使用自定義配置。討論的議題如下:

  • 命名空間:System.Configuration
  • 對象模型配置概念
  • 編寫一個基本的配置節
  • 使用自定義配置節
  • 添加自定義元素
  • 添加元素集合
  • 高級元素集合
  • 自定義配置節組
  • 保存配置更改
  • 配置技巧和竅門
  • 高級配置主題
  • 附錄
    1.附錄A:配置結構的級聯
    2.附錄B:包含外部配置文件
  • 1、命名空間:System.Configuration

    新的.NET 2.0的配置精華核心是System.Configuration命名空間。默認情況下,當引用了System.dll程序集,此命名空間是可用的。它包括.NET 1.1的所有功能,包括舊的ConfigurationSettings類(現在.NET 2.0不推薦使用了)。然而,為了獲得.NET 2.0的新特性,你必須添加對System.Configuration.dll程序集的引用。在這個程序集里你會發現新的配置系統的核心,ConfigurationManager靜態類。

    ConfigurationManager類是一個全局的訪問一個應用程序的配置的入口。由于類是靜態的,其所有的成員也是靜態的。這使得讀取如AppSettingsConnectionStrings和自定義配置節輕而易舉。雖然這類似于ConfigurationSettings類它也提供一些能夠更加安全地訪問應用程序的配置的新功能。這些新功能,也可以允許將配置設置保存到任何配置節:自定義或其他的。

    除了ConfigurationManager類是自定義配置節的生命線。下面列出的基類可以幫助你編寫自己的配置對象模型。還將有更多關于這方面的。除了一個基類集是一個校驗集,可以用來確保你的自定義配置節的準確性。此外,如果你的需要很簡單,只需要用一些預制的配置。

    基本類型

    • ConfigurationSection - 配置節基類
    • ConfigurationSectionCollection - 配置節集合的基類
    • ConfigurationSectionGroup - 配置節組的基類
    • ConfigurationSectionGroupCollection - 配置節組集合的基類
    • ConfigurationElement - 配置元素的基類
    • ConfigurationElementCollection - 配置元素集合的基類
    • ConfigurationConverterBase - 自定義轉換器基類*1
    • ConfigurationValidatorBase - 自定義驗證器基類*2

    支持類型

    • ConfigurationManager - 提供對客戶端應用程序配置文件的訪問
    • Configuration - 表示一個應用程序的配置
    • ConfigurationProperty - 表示屬性或配置元素的子元素
    • ConfigurationPropertyAttribute - 以聲明方式指示.NET Framework,以實例化配置屬性
    • ConfigurationPropertyCollection - 配置屬性的集合
    • ConfigurationPropertyOptions - 指定要應用于屬性的選項

    驗證類型

    • CallbackValidator - 提供對對象的動態驗證
    • CallbackValidatorAttribute - 指定用于代碼驗證的CallbackValidator對象
    • IntegerValidator - 對Int32值進行驗證
    • IntegerValidatorAttribute - 以聲明的方式指示.NET Framework對配置屬性執行整數驗證
    • LongValidator - 對Int64值進行驗證。
    • LongValidatorAttribute - 以聲明的方式指示.NET Framework對配置屬性執行長整型驗證
    • PositiveTimeSpanValidator - 對TimeSpan對象進行驗證。
    • PositiveTimeSpanValidatorAttribute - 以聲明的方式指示.NET Framework對配置屬性執行時間驗證
    • RegexStringValidator - 根據正則表達式提供的規則提供字符串驗證
    • RegexStringValidatorAttribute - 以聲明方式指示.NET Framework使用正則表達式在配置屬性中執行字符串驗證
    • StringValidator - 對字符串進行驗證
    • StringValidatorAttribute - 以聲明的方式指示.NET Framework對配置屬性執行字符串驗證
    • SubclassTypeValidator - 驗證一個對象是否是指定類型的派生類*3
    • SubclassTypeValidatorAttribute - 以聲明方式指示.NET Framework對配置屬性執行驗證
    • TimeSpanValidator - 對TimeSpan對象進行驗證
    • TimeSpanValidatorAttribute - 以聲明的方式指示.NET Framework對配置屬性執行時間驗證

    轉換器類型

    • CommaDelimitedStringCollectionConverter - 將以逗號分隔的字符串值和CommaDelimitedStringCollection對象相互轉換
    • GenericEnumConverter - 在字符串和枚舉類型之間進行轉換
    • InfiniteIntConverter - 在字符串和標準無限或整數值之間轉換
    • InfiniteTimeSpanConverter - 在字符串和標準無限TimeSpan值之間轉換
    • TimeSpanMinutesConverter - 轉換以分鐘表示的時間跨度
    • TimeSpanMinutesOrInfiniteConverter - 轉換以分鐘表示(或作為標準的無限時間跨度)的TimeSpan
    • TimeSpanSecondsConverter - 轉換以秒表示的時間跨度
    • TimeSpanSecondsOrInfiniteConverter - 轉換以秒表示的TimeSpan,或將其轉換為標準的無限時間跨度
    • TypeNameConverter - 在類型和字符串值之間轉換
    • WhiteSpaceTrimStringConverter - 將字符串轉換為它的規范化格式

    預制的配置節

    • AppSettingsSection - 為<appSettings> 配置節提供配置系統支持
    • ConnectionStringsSection - 提供對<connectionStrings>配置節的編程訪問
    • ProtectedConfigurationSection - 提供對configProtectedData配置節的編程訪問
    • IgnoreSection - 為不是由System.Configuration類型處理的配置節提供包裝類型定義

    預制配置集合*4

    • CommaDelimitedStringCollection - 與CommaDelimitedStringCollectionConverter結合使用(譯注:表示以逗號分隔的字符串元素的集合)
    • KeyValueConfigurationCollection - 用于在配置節中配置鍵/值對(譯注:包含KeyValueConfigurationElement對象的集合)
    • NameValueConfigurationCollection - 用于在配置節中配置名稱/值對(譯注:包含NameValueConfigurationElement對象的集合)

    注意:

    • *1自定義轉換器用于在XML文件中字符串表示與配置對象模型中強(譯注:natively,或者翻譯為“原生”?下同)類型之間轉換
    • *2自定義驗證器是用來驗證在配置對象模型強類型數據的準確性
    • *3這關系到配置對象模型的概念,將在下一節討論
    • *4這些常見的配置集合可用于自定義配置節

    2、對象模型配置概念

    在我們接下來創建一些自定義配置之前,有必要先來學習一些對象模型配置的概念。.NET 2.0配置系統最終提供了一組對象表示配置設置的結構和強類型訪問配置數據。這與在XML文件中存儲和檢索配置的更多通用的方法相反,它們通常需要通過DOM或讀取流讀取值,通過DOM或者寫流將改變寫回文件。在我私人寫的更高級的配置系統中,包括一些緩存機制來加速讀取和寫配置值。創建一個高度可定制的配置文件,同時保持良好的性能一直是一個難點。

    .NET 2.0的配置對象模型不在需要那些龐大的處理XML配置數據的方法。作為一個簡單的例子,將ConnectionStrings節對通用配置元素的配置管理整合進ConfigurationManager對象,通過一個唯一的名字非常容易查找和訪問一個指定的數據庫連接串。這是因為有一個.NET 集合類,它列出連接字符串配置的對象。每一個連接字符串對象都被一個名字鍵標記。.NET類對XML元素的映射如下所示:

    ConnectionStringsSection<connectionStrings>
    ConnectionStringSettingsCollection [implicitly created]
    ConnectionStringSettings <add name="MyConnection" connectionString="blahblah">

    訪問MyConnetcion就如下面所示代碼一樣簡單:

    string myConnectionString = ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;

    ConnectionStrings非常簡單,所以讓我們來看一個經常使用,但不那么明顯的.NET 2.0配置系統:<system.web>配置組。你可能不知道它,但是但這一個復雜的配置節使用了一組類,用這組類我們可以創建自定義的配置節。讓我們以class>emement關系的形式來看一下System.Web.Configuration對象模型:

    Class:

    Element:

    SystemWebSectionGroup <system.web>
    AuthenticationSection <authentication>
    AuthorizationSection <authorization>
    CustomErrorsSection <customErrors>
    CustomErrorsCollection [implicitly created]
    CustomError <error statusCode="404" redirect="...">
    HttpModulesSection <httpModules>
    HttpModuleActionCollection [implicitly created]
    HttpModuleAction <add name="myModule" type="...">
    HttpHandlersSection <httpHandlers>
    HttpHandlerActionCollection [implicitly created]
    HttpModuleActionCollection <add verb="*" type="..." path="...">

    這只是System.Web ASP.NET配置節組提供的一套完整的配置節的一小部分。這些設置都可以通過一個精巧包裝的對象模型訪問,它歸根于System.Web.Configuration.SystemWebSectionGroup類。在事件的要求下,使用這個對象模型甚至可以將更新和保存回web.config文件,假設該代碼有改變和保存的權限。

    .NET 2.0配置系統用這個對象模型為我們處理解析、驗證、安全和population(譯注:關于 Population:這個詞原型是Populate,有填充的含義。例如老外有時候表述給下拉列表增加列表項時,就說“Populate the list”。我想在文章里應該是指反序列話時往配置文件中寫入配置元素吧)。除了編寫自定義配置節,這是相當簡單的,它完全去除了對XML的考慮,當在應用程序中使用你的配置時。不僅如此,在應用程序的任何地方都可以直接訪問這個精美的包裝、強類型、安全對象模型,而無需擔心向注冊表那樣給自定義XML配置文件查找或存儲文件路徑。為不一致、不靈活、低性能的自定義配置管理器煩惱的時代一去不復返了。

    3、編寫一個基本的配置節

    如果在這之前的東西嚇到了你,別擔心。編寫代碼來提供自定義配置節到你的應用程序非常簡單。處理難看的XML、安全檢查、類型轉換等等絕大部分問題,已經被.NET 2.0框架中已有代碼處理了。由于System.Configuration的一組基類集,要創建一個簡單的配置節的實際代碼量非常非常少。讓我們開始創建一個含有一個字符串值、一個布爾值和一個時間跨度值的簡單配置節。每一個配置節都必須繼承ConfigurationSection基類,讓我從以下內容開始:

    代碼#region Using Statements using System; using System.Configuration; #endregionnamespace Examples.Configuration {/// <summary>/// An example configuration section class./// </summary>public class ExampleSection: ConfigurationSection{#region Constructorsstatic ExampleSection(){// Predefine properties here}#endregion// Declare static property fields here// Declare expose properties here} }

    一旦你開始定義一個配置節類,你將必須定義有效的配置屬性。一個配置屬性,通過ConfigurationProperty類表示,描述了一個配置項,它將在你的配置節中可用。有兩種方法定義配置屬性,編程式(programmatic)和聲明式(declarative)。這兩種方法我個人都喜歡用,因為聲明式方法有助于自描述的代碼,編程式方法更嚴謹。這保證了只有你期望的確切的對象模型生成和支持,但是維護起來有些乏味,因為對一個配置屬性兩者都要更新。注:在這文章中,作為一個完整的例子我將使用這兩種方法。

    讓我們開始往我們的示例配置節中填寫代碼。首先定義靜態屬性字段,然后在類的靜態構造器中創建那些字段。最后通過編寫C#屬性暴露配置數據。自定義的配置節完整源碼應該看起來像下面這樣:

    代碼#region Using Statements using System; using System.Configuration; #endregionnamespace Examples.Configuration {/// <summary>/// An example configuration section class./// </summary>public class ExampleSection: ConfigurationSection{#region Constructors/// <summary>/// Predefines the valid properties and prepares/// the property collection./// </summary>static ExampleSection(){// Predefine properties heres_propString = new ConfigurationProperty("stringValue",typeof(string),null,ConfigurationPropertyOptions.IsRequired);s_propBool = new ConfigurationProperty("boolValue",typeof(bool),false,ConfigurationPropertyOptions.None);s_propTimeSpan = new ConfigurationProperty("timeSpanValue",typeof(TimeSpan),null,ConfigurationPropertyOptions.None);s_properties = new ConfigurationPropertyCollection();s_properties.Add(s_propString);s_properties.Add(s_propBool);s_properties.Add(s_propTimeSpan);}#endregion#region Static Fieldsprivate static ConfigurationProperty s_propString;private static ConfigurationProperty s_propBool;private static ConfigurationProperty s_propTimeSpan;private static ConfigurationPropertyCollection s_properties;#endregion#region Properties/// <summary>/// Gets the StringValue setting./// </summary>[ConfigurationProperty("stringValue", IsRequired=true)]public string StringValue{get { return (string)base[s_propString]; }}/// <summary>/// Gets the BooleanValue setting./// </summary>[ConfigurationProperty("boolValue")]public bool BooleanValue{get { return (bool)base[s_propBool]; }}/// <summary>/// Gets the TimeSpanValue setting./// </summary>[ConfigurationProperty("timeSpanValue")]public TimeSpan TimeSpanValue{get { return (TimeSpan)base[s_propTimeSpan]; }}/// <summary>/// Override the Properties collection and return our custom one./// </summary>protected override ConfigurationPropertyCollection Properties{get { return s_properties; }}#endregion} }

    一旦你完成了,就是這樣。此自定義配置節準備就緒。如果你喜歡寫更少的代碼,你可以不用構造器和靜態字段,將每個值用過一個字符串鍵存儲在默認的屬性集合中。這將導致配置節本身要求更少的代碼,但是要求整理上更少的定義。上述屬性將被下面的代碼的替代,靜態字段和構造器可以刪掉。順便說一下,這就是純粹的聲明式方法:

    代碼#region Properties/// <summary>/// Gets the StringValue setting./// </summary>[ConfigurationProperty("stringValue", IsRequired=true)]public string StringValue{get { return (string)base["stringValue"]; }}/// <summary>/// Gets the BooleanValue setting./// </summary>[ConfigurationProperty("boolValue")]public bool BooleanValue{get { return (bool)base["boolValue"]; }}/// <summary>/// Gets the TimeSpanValue setting./// </summary>[ConfigurationProperty("timeSpanValue")]public TimeSpan TimeSpanValue{get { return (TimeSpan)base["timeSpanValue"]; }}#endregion

    一個快速筆記,ConfigurationProperty真正是什么。默認,除非一個自定義元素明確地寫出,所有的ConfigurationProperty都定義在一個App.config或Web.config文件中。創建和自定義配置元素集合將在后面討論。

    4、使用自定義配置節

    現在你已經為你的自定義配置寫了一個類,則你需要在一個App.config文件中定義自定義節。你必須添加必要的XML,以便他能被.NET 2.0配置系統解析。App.config文件要改成下面的那樣,ExampleSection才可用,假定上述代碼已經被編譯成Examples.Configuration.dll:

    代碼<configuration><configSections><section name="example" type="Examples.Configuration.ExampleSection, Examples.Configuration" /></configSections><examplestringValue="A sample string value."boolValue="true"timeSpanValue="5:00:00"/> </configuration>

    <configSections>及其子節點的一個快速解釋。與內置的配置節不一樣,他們是隱式定義的,自定義配置節必須顯式地定義。這是通過<configSections>元素和它相應的<section>子元素來完成的。應當指出,一個節的名字一般是很重要的,不能任意選擇的。一會兒你就知道為什么了。一個配置節映射到一個完全限定的類名,其后是程序集名。選擇性地,你可以指定區域性、版本、公鑰(用于程序集的簽名)值,如果你想確保只在特定的程序集的特定版本中搜索,當你的.config被解析時。在上面的例子中,字符串逗號之前的那部分是類名,后面那部分是程序集名(不包括.dll后綴)。

    最后,你可以在代碼中用ConfigurationManager類使用你的自定義配置了。ConfigurationManager提供了一個叫做GetSection的方法,它允許你訪問任何已經定義了的自定義設置。當你訪問自定義配置節是,通常最好用動態轉換和檢查是否為空,就像這樣:

    訪問自定義配置節private string m_string; private bool m_bool; private TimeSpan m_timespan;void GetExampleSettings() {ExampleSection section = ConfigurationManager.GetSection("example") as ExampleSection;if (section != null){m_string = section.StringValue;m_bool = section.BooleanValue;m_timespan = section.TimeSpanValue;} }

    這里最重要注意的是選擇代表一個配置節根元素的名字。在App.config文件的例子中,節被定義為 “example”。因為調用GetSection()時加載節查找名字‘example’,在App.config中任何試圖為“example“重命名為其他名字將導致GetExampleSettings()失敗。這是不可以任意選擇一個自定義配置節的名子,除非明確地設計調整以保持一致,可能是通過使用另一個配置節。




    本文轉自吳秦博客園博客,原文鏈接:http://www.cnblogs.com/skynet/archive/2010/03/20/1690475.html,如需轉載請自行聯系原作者

    總結

    以上是生活随笔為你收集整理的揭开.NET 2.0配置之谜(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。