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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

configSections

發布時間:2025/3/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 configSections 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于最近一個項目的數據庫變動比較頻繁, 為了減少數據層的負擔, 打算采用.net的MVC框架, 使用LINQ對付數據層. 這個框架的web.config文件里出現了configSections section, 這個之前沒有留意, 乘著項目不是很急, 順勢把它給搞懂, 花了一下午時間, 終于搞定, 有點心得, 寫下來以供面試官翻閱. asp.net為啥要引用configSections? 因為用戶的一些對象, 可能在config里進行配置, 但是config怎么能隨便讓你添加自己的節點呢! 不行你自己試試, 在任何位置添加任何沒有申明的節點, 系統都不會讓你通過, 更不會讓你去讀它了, 當然, 你打算在別的xml文件里添加節點, 然后讀出來, 創建對象, 這個沒問題. 為了系統能有組織的管理用戶的在配置文件里的自定義信息, 就要使用configSections了, 分3步走: 1. 創建一個實現IConfigurationSectionHandler的類 2. 在config文件里添加如下節點: <configuration>
????????????? <configSections>
?????????????????? <section name="NameM" type="LearningConfiguration.NameSectionHandler"/>
????????????? </configSections>
????????????? <NameM>
?????????????????? <Add key="name1" firstname="Jim" lastname="w1"/>
?????????????????? <Add key="name2" firstname="Chris" lastname="w2"/>
?????????????? </NameM>
說明: 在configSections下添加一個section子節點, 寫好標示名和類型, 然后在緊接這下面實現這個標示名的細節內容,就是我們當初想添加的自己的自定義信息了. 3. 實現IConfigurationSectionHandler唯一的方法: public object Create(object parent, object configContext, XmlNode section), 這里的最后一個參數就是自定義信息那個節點了, 粗體部分. 通過處理這堆信息, 返回你要的對象. 4. 使用這個返回的對象,通過System.Configuration.ConfigurationManager.GetSection()方法. 以下是示例代碼: (NameSectionHandler.cs) Code
namespace?LearningConfiguration
{
????
public?class?NameSectionHandler?:?IConfigurationSectionHandler
????{
????????
#region?IConfigurationSectionHandler?Members
????????
public?object?Create(object?parent,?object?configContext,?XmlNode?section)
????????{
????????????Dictionary
<string,?NameManagement>?names?=?new?Dictionary<string,?NameManagement>();
????????????
????????????
string?key?=?string.Empty;
????????????
string?firstName?=?string.Empty;
????????????
string?lastName?=?string.Empty;
????????????
foreach?(XmlNode?childNode?in?section.ChildNodes)
????????????{
????????????????
if?(childNode.Attributes["key"]?!=?null)
????????????????{
????????????????????key?
=?childNode.Attributes["key"].Value;

????????????????????
if?(childNode.Attributes["firstname"]?!=?null)
????????????????????{
????????????????????????firstName?
=?childNode.Attributes["firstname"].Value;
????????????????????}
????????????????????
else
????????????????????{
????????????????????????firstName?
=?string.Empty;
????????????????????}
????????????????????
if?(childNode.Attributes["lastname"]?!=?null)
????????????????????{
????????????????????????lastName?
=?childNode.Attributes["lastname"].Value;
????????????????????}
????????????????????
else
????????????????????{
????????????????????????lastName?
=?string.Empty;
????????????????????}
????????????????????names.Add(key,?
new?NameManagement(firstName,?lastName));
????????????????}
????????????}
????????????
return?names;
????????}
????????
#endregion
????}
}
(NameManagement.cs) namespace?LearningConfiguration
{
????
public?class?NameManagement
????{
????????
string?_firstName;
????????
public?string?FirstName
????????{
????????????
get?{?return?this._firstName;?}
????????????
set?{?this._firstName?=?value;?}
????????}
????????
string?_lastName;
????????
public?string?LastName
????????{
????????????
get?{?return?this._lastName;?}
????????????
set?{?this._lastName?=?value;?}
????????}
????????
public?NameManagement(string?firstName,?string?lastName)
????????{
????????????
this.FirstName?=?firstName;
????????????
this.LastName?=?lastName;
????????}
????????
public?string?RetrieveFullName()
????????{
????????????
return?string.Format("{0}?{1}",?this.FirstName,?this.LastName);
????????}
????}
}
(Default.aspx.cs) namespace?LearningConfiguration
{
????
public?partial?class?_Default?:?System.Web.UI.Page
????{
????????
protected?void?Page_Load(object?sender,?EventArgs?e)
????????{
????????????Dictionary
<string,?NameManagement>?names?=?ConfigurationManager.GetSection("NameM")?as?Dictionary<string,?NameManagement>;
????????????
if?(names?!=?null)
????????????{?
????????????????
foreach(string?key?in?names.Keys)
????????????????{
????????????????????NameManagement?name?
=?names[key]?as?NameManagement;
????????????????????Response.Write(name.RetrieveFullName());
????????????????}
????????????}
????????}
????}
}
與以上調用方式一樣: Code
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Web;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?System.Configuration;
using?System.Collections.Specialized;
using?LearningConfiguation;

public?partial?class?Default4?:?System.Web.UI.Page
{
????
protected?void?Page_Load(object?sender,?EventArgs?e)
????{
????????Dictionary
<String,?NameManagement>?names?=?System.Configuration.ConfigurationManager.GetSection("test/aa")?as?Dictionary<String,?NameManagement>;
????????Dictionary
<String,?NameManagement>.KeyCollection?keys?=?names.Keys;
????????
foreach?(String?key?in?keys)
????????{
????????????NameManagement?nm?
=?names[key]?as?NameManagement;
????????????Response.Write(nm.FirstName);
????????????Response.Write(
"<br>");
????????????Response.Write(nm.LastName);
????????}
????}
}
1.為什么需要自定義節點

為了增加應用程序的可移植性,通常網站需要配置一些自定義的節點,例如:文件上傳的路徑等,再深入的應用,可以定義工廠方法需要創建的類。

?

2.configSections使用方法

configSections節點下定義自定義節點可以幫我們實現我們自己的節點。

首先定義自己的節點,定義方法如下:

<configSections>
??? <sectionGroup name="section group name">
??????? <section name="section name" type="configuration section handler class" />
??? </sectionGroup>
</configSections>


定義自己的節點必須在configSections節點。

sectionGroup 元素充當 section 元素的容器。

section 元素將配置節處理程序與配置元素或節關聯。由于 ASP.NET 不對如何處理配置文件內的設置作任何假設,因此這非常必要。但 ASP.NET 會將配置數據的處理委托給配置節處理程序,(稍候說明。)每個 section 元素均標識一個配置節或元素。可以在 sectionGroup 元素中對 section 元素進行邏輯分組,以對 section 元素進行組織并避免命名沖突。section 和 sectionGroup 元素包含在 configSections 元素中。

sectionGroup節點屬性:

name:必選的 String 屬性,這是 group 元素在配置文件的節設置區域中使用的名稱。

section節點屬性:

name:必選的 String 屬性,指定與 type 屬性中指定的配置節處理程序關聯的配置節或元素的名稱。這是該元素在配置文件的節設置區域中使用的名稱。

type:必選的 String 屬性,指定用來執行如下操作的配置節處理程序類的名稱:處理在 name 屬性中指定的節或元素中的配置設置。

?


現在定義好了自己的節點,可以使用該節點了。使用方法如下:

<section group name>
??? <section name>
??????? <add key="key1" value="value1" />
??? </section name>
</section group name>


定義好了自己的節點,如何讀取節點信息呢?

以下是msdn上的原話:

您可以用自己的 XML 配置元素來擴展標準的 ASP.NET 配置設置集。若要完成該操作,您必須創建自己的配置節處理程序。

該處理程序必須是一個實現 System.Configuration.IConfigurationSectionHandler 接口或 System.Configuration.ConfigurationSection 類的 .NET Framework 類。

節處理程序解釋并處理 Web.config 文件特定部分中 XML 配置元素中定義的設置,并根據配置設置返回適當的配置對象。處理程序類返回的配置對象可以是任何數據結構;它不限于任何基配置類或配置格式。ASP.NET 使用該配置對象,以對自定義配置元素進行讀取和寫入。


上面這段話的意思就是說,我們要定義一個類,這個類要繼承自System.Configuration.IConfigurationSectionHandler 接口或 System.Configuration.ConfigurationSection 類。


然后用這個類來處理我們自定義的節點。

我們看到System.Configuration.IConfigurationSectionHandler接口中,只有一個方法:


//創建配置節處理程序
Object Create (Object parent, Object configContext, XmlNode section)



返回值

創建的節處理程序對象。

?


這個類是干什么用的呢?讓我們通過一個例子來看看。

?


首先,我們新建一個網站項目,并在web.config中加入以下節點:


<configSections>
??? <sectionGroup name="WebSiteInfo">
??????? <section name="basicInfo" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
??????? <section name="fileUpload" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
??? </sectionGroup>
</configSections>

<WebSiteInfo>
??? <basicInfo>
??????? <add key="name" value="huchen's homepage"/>
??????? <add key="version" value="1.0"/>
??? </basicInfo>
??? <fileUpload>
??????? <add key="fileUploadPath" value="E:\\MyHomePage\\Web\\Upload\\"/>
??????? <add key="fileUploadSizeMax" value="2M"/>
??? </fileUpload>
</WebSiteInfo>


以上我們在WebSiteInfo節點下定義了兩個節點basicInfo和fileUpload,并定義了節點處理程序類ConfigurationSectionTest.WebSiteInfoHandler,并且隨后運用了我們定義的節點。


我們來看看節點處理程序ConfigurationSectionTest.WebSiteInfoHandler。

任意建立一個項目,新建一個類,或者直接在App_Code里新建一個類,如下:

并在Create函數中設置一個斷點。

?

?

namespace ConfigurationSectionTest
{
??? /// <summary>
??? ///WebSiteInfoHandler 的摘要說明
??? /// </summary>
??? public class WebSiteInfoHandler : IConfigurationSectionHandler
??? {
??????? public WebSiteInfoHandler()
??????? {
??????????? //
??????????? //TODO: 在此處添加構造函數邏輯
??????????? //

??????? }

??????? #region IConfigurationSectionHandler 成員

??????? public object Create(object parent, object configContext, System.Xml.XmlNode section)
??????? {
?????????? //這里我們首先返回個hello,并且在此處設置一個斷點。看看程序什么時候執行到這。
??????????? return "hello";
??????? }

??????? #endregion
??? }

}


然后在Default.aspx的Page_Load事件處理程序中去訪問我們自定義的節點,并在ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"); 這條語句上設置斷點。


protected void Page_Load(object sender, EventArgs e)
{
??? Object o = ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");
}

?


好了,我們啟動調試,看到程序首先執行到ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");這句。

然后執行到ConfigurationSectionTest.WebSiteInfoHandler中的Create函數。

我們再看看這時處理函數中參數的值:

parent為null

configContext 為配置上下文對象。

section 的InnerXml為<add key="name" value="huchen's homepage" /><add key="version" value="1.0" />

?


按F11繼續執行return "hello", 繼續執行...

在執行到Object o = ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo")后面的“}“,我們發現o的值為”hello”。


相信您已經明白的差不多了,當讀取自定義節點的內容時,程序去執行我們定義的節點處理程序,并把節點中的內容傳給Create函數中的參數。然后我們在Create中自己處理節點下的內容,并返回我們格式化后的節點內容給調用者,也就是ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo")。

注意:程序第一次運行的時候可以調試到Create這個方法,第二次運行的時候就調試不到了,這是因為配置文件時緩存了起來.

只有改變了配置文件或者繼承自IConfigurationSectionHandler的類才會重新調用.

?

好,知道這些以后,我們就來完善我們的代碼,我們在Create中處理傳進來的節點內容。


為了簡單起見,我們引入兩個類NameValueCollection,NameValueSectionHandler。

NameValueCollection:表示可通過鍵或索引訪問的關聯 String 鍵和 String 值的集合。

NameValueSectionHandler:提供配置節中的名稱/值對配置信息。NameValueSectionHandler 這個類也繼承IConfigurationSectionHandler
反編譯可以看出NameValueSectionHandler 的Create方法把參數section的結果轉化成了一個集合,就是NameValueCollection。

那么我們可以在節點處理程序中的Create函數中寫如下代碼:


NameValueCollection configs;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
configs =(NameValueCollection)baseHandler.Create(parent,configContext,section);
Return configs;

?

這樣我們就可以這樣訪問我們的節點了:


string myWebSiteName = ((NameValueCollection)ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"))["name"];


在Default.aspx的Page_Load事件處理程序中添加如下代碼:


string myWebSiteName = ((NameValueCollection)ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"))["name"];
Response.Write(myWebSiteName);



Ctrl+F5運行,可以看到頁面輸出了huchen's homepage

?

轉載于:https://www.cnblogs.com/jhxk/articles/1609182.html

總結

以上是生活随笔為你收集整理的configSections的全部內容,希望文章能夠幫你解決所遇到的問題。

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