亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

在web.config和app.config文件中增加自定義配置節點的方法

2020-01-24 02:54:18
字體:
來源:轉載
供稿:網友

有經驗的開發人員都知道在開發.NET應用時可以利用配置文件保存一些常用并且有可能變化的信息,例如日志文件的保存路徑、數據庫連接信息等等,這樣即使生產環境中的參數信息與開發環境不一致也只需要更改配置文件而不用改動源代碼再重新編譯,極其方便。并且我們一般還約定,在<appSettings>節點保存應用程序的配置信息,在<connectionStrings>中保存數據庫連接字符串信息。

上面的這些方法和約定足以讓我們在大部分開發中獲得方便,但是在有些情況下有些配置信息可以按組分類存放,如果采用上面的方法不僅不直觀,而且讀取起來也不是太方便,幸好在.NET里就提供了這樣的方法。如果有使用過Log4Net或者Enyim.Caching的朋友,肯定對下面的配置不會陌生:

復制代碼 代碼如下:

<sectionGroup name="enyim.com"><section name="memcached"
type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" /></sectionGroup>

或:
復制代碼 代碼如下:

<configSections><section name="log4net" type="System.Configuration.IgnoreSectionHandler"/></configSections>

在出現上面配置的配置文件中,我們就會找到名稱為"enyim.com"或者"log4net"的節點,盡管它們本不屬于config文件的默認節點,但是通過上面的配置之后程序運行并不會報錯。這樣一來,相關配置信息也可以很好分類保存起來。

在這里我演示一個簡單的例子,這個例子來源于我的一個從2006年起就開始開發的自用軟件(因為沒有美化所以沒有免費發布),在這個應用程序的connfig文件中我增加了一些特有的配置,所以新增了一個自己的節點,app.config文件內容如下:
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
   <configSections>      
    <section name="SoftwareSettings" type="ImageAssistant.Configuration.SoftwareSettings, ImageAssistant" />  
   </configSections>  
     <SoftwareSettings>    
       <LoadSettings>      
         <add key="LoadBmp" value="true"/>      
         <add key="LoadJpg" value="true"/>      
         <add key="LoadGif" value="true"/>      
         <add key="LoadPng" value="false"/>    
       </LoadSettings>    
     <PathSettings SavePath="C:/ResizeImages/" SearchSubPath="true"/>  
   </SoftwareSettings>  

   <appSettings>    
      <add key="LoadBmp" value="true"/>    
      <add key="LoadJpg" value="true"/>    
      <add key="LoadGif" value="true"/>    
      <add key="LoadPng" value="false"/>   
      <add key="IncludeSubPath"  value="true"/> 
   </appSettings>    
</configuration>


在config文件中我們使用<section name="SoftwareSettings" type="ImageAssistant.Configuration.SoftwareSettings, ImageAssistant" />告訴應用程序對于配置文件中的SoftwareSettings節點,其對應的類是ImageAssistant程序集中ImageAssistant.Configuration.SoftwareSettings類,并且在<SoftwareSettings>節點中我們還看到有<LoadSettings>節點和<PathSettings>節點,其中<LoadSettings>是一個節點集合,還包含有多個子節點,為了表示清楚這些關系我們需要添加四個類:SoftwareSettings、LoadSettingsCollection、LoadSettingsElement及PathSettingElement。為了發布方便,我將這四個類的代碼放在一個物理文件中,代碼如下(注意添加對System.Configuration.dll的引用):
復制代碼 代碼如下:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 

namespace ImageAssistant.Configuration 

    public sealed class LoadSettingsCollection : ConfigurationElementCollection 
    { 
        private IDictionary<string, bool> settings; 

        protected override ConfigurationElement CreateNewElement() 
        { 
            return new LoadSettingsElement(); 
        } 

        protected override object GetElementKey(ConfigurationElement element) 
        { 
            LoadSettingsElement ep = (LoadSettingsElement)element; 

            return ep.Key; 
        } 

        protected override string ElementName 
        { 
            get 
            { 
                return base.ElementName; 
            } 
        } 

        public IDictionary<string, bool> Settings 
        { 
            get 
            { 
                if (settings == null) 
                { 
                    settings = new Dictionary<string, bool>(); 
                    foreach (LoadSettingsElement e in this) 
                    { 
                        settings.Add(e.Key, e.Value); 
                    } 
                } 
                return settings; 
            } 
        } 

        public bool this[string key] 
        { 
            get 
            { 
                bool isLoad = true; 
                if (settings.TryGetValue(key, out isLoad)) 
                { 
                    return isLoad; 
                } 
                else 
                { 
                    throw new ArgumentException("沒有對'" + key + "'節點進行配置。"); 
                } 
            } 
        } 

    } 

    public class LoadSettingsElement : ConfigurationElement 
    { 
        [ConfigurationProperty("key", IsRequired = true)] 
        public string Key 
        { 
            get { return (string)base["key"]; } 
            set { base["key"] = value; } 
        } 
        [ConfigurationProperty("value", IsRequired = true)] 
        public bool Value 
        { 
            get { return (bool)base["value"]; } 
            set { base["value"] = value; } 
        } 
    } 

    public class PathSettingElement : ConfigurationElement 
    { 
        /// <summary>  
        ///   
        /// </summary>  
        [ConfigurationProperty("SavePath", IsRequired = true)] 
        public string SavePath 
        { 
            get { return (string)base["SavePath"]; } 
            set { base["SavePath"] = value; } 
        } 
        /// <summary>  
        ///   
        /// </summary>  
        [ConfigurationProperty("SearchSubPath", IsRequired = false, DefaultValue = true)] 
        public bool SearchSubPath 
        { 
            get { return (bool)base["SearchSubPath"]; } 
            set { base["SearchSubPath"] = value; } 
        } 
    } 

    /// <summary>  
    /// 對應config文件中的  
    /// </summary>  
    public sealed class SoftwareSettings : ConfigurationSection 
    { 
        /// <summary>  
        /// 對應SoftwareSettings節點下的LoadSettings子節點  
        /// </summary>  
        [ConfigurationProperty("LoadSettings", IsRequired = true)] 
        public LoadSettingsCollection LoadSettings 
        { 
            get { return (LoadSettingsCollection)base["LoadSettings"]; } 
        } 

        /// <summary>  
        /// 對應SoftwareSettings節點下的PathSettings子節點,非必須  
        /// </summary>  
        [ConfigurationProperty("PathSettings", IsRequired = false)] 
        public PathSettingElement PathSetting 
        { 
            get { return (PathSettingElement)base["PathSettings"]; } 
            set { base["PathSettings"] = value; } 
        } 

    } 
}

在上面的代碼中可以看到ConfigurationProperty這個屬性,這是表示對應的屬性在config文件中的屬性名,IsRequired表示是否是必須的屬性,還有DefaultValue表示屬性的默認值。初次之外,我們還要注意以下關系:
SoftwareSettings:根節點,繼承自ConfigurationSection。
LoadSettingsCollection:子節點集合,繼承自ConfigurationElementCollection。
LoadSettingsElement:子節點,繼承自ConfigurationElement。
PathSettingElement:子節點,繼承自ConfigurationElement。
編寫了如下代碼之后,我們又該如何使用上面的類呢?其實很簡單,如下:
復制代碼 代碼如下:

class Program 
    { 
        static void Main(string[] args) 
        { 
            SoftwareSettings softSettings = ConfigurationManager.GetSection("SoftwareSettings") as SoftwareSettings; 

            foreach (string key in softSettings.LoadSettings.Settings.Keys) 
            { 
                Console.WriteLine("{0}={1}", key, softSettings.LoadSettings[key]); 
            } 
            Console.WriteLine("SavePath={0},SearchSubPath={1}", softSettings.PathSetting.SavePath, softSettings.PathSetting.SearchSubPath); 
            Console.ReadLine(); 
        } 
    }

這個程序的運行結果如下:
LoadBmp=True
LoadJpg=True
LoadGif=True
LoadPng=False
SavePath=C:/ResizeImages/,SearchSubPath=True

總結:在上面的config文件中通過<appSettings>也達到了類似的效果,但是通過自定義節點我們可以方便地讀取相關的應用程序配置,同時也便于維護。如果在開發過程中遇到本文中類似的情況,不妨采取本文所述的方式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情电影中文字幕| 欧美巨猛xxxx猛交黑人97人| 91久久精品视频| 91视频免费网站| 亚洲综合在线播放| 九九热精品在线| 久久视频在线视频| 亚洲色图17p| 91精品国产综合久久久久久久久| 欧美激情va永久在线播放| 日本精品视频在线| 亚洲色图美腿丝袜| 国产精品主播视频| 91精品视频专区| 久久亚洲影音av资源网| 亚洲va久久久噜噜噜| 日韩一级裸体免费视频| 国产久一一精品| 国产精品海角社区在线观看| 91香蕉亚洲精品| 精品国产91久久久久久| 亚洲第一黄色网| 久久久精品电影| 美女精品视频一区| 亚洲天堂久久av| 欧美在线激情视频| 成人av电影天堂| 亚洲国产又黄又爽女人高潮的| 欧美精品激情在线| 亚洲人成五月天| 久久综合久久八八| 国产在线精品成人一区二区三区| 亚洲国产精品久久久久久| 亚洲网站在线观看| 久久av在线播放| 亚洲美女www午夜| 久久久99久久精品女同性| 欧美国产视频一区二区| 国产成人在线亚洲欧美| 久久久久成人精品| 精品福利樱桃av导航| 精品久久久免费| 中文字幕亚洲色图| 欧美另类在线观看| 午夜伦理精品一区| 久久99亚洲热视| 亚洲一区二区三区xxx视频| 久久精品一区中文字幕| 成人黄色短视频在线观看| 久久97久久97精品免视看| 亚洲欧美日韩天堂| 欧美另类极品videosbestfree| 欧美午夜片在线免费观看| 国产精品爽黄69| 国产亚洲精品久久久久久牛牛| 欧美日韩ab片| 神马久久桃色视频| 久久99精品久久久久久噜噜| 日本道色综合久久影院| 国产精品毛片a∨一区二区三区|国| 亚洲电影中文字幕| 91精品国产精品| 成人a免费视频| 成人黄色午夜影院| 原创国产精品91| 亚洲美女av在线| 久久综合免费视频| 国产91ⅴ在线精品免费观看| 国产精品天天狠天天看| 欧美黑人xxxx| 久99久在线视频| 欧美日韩国产在线播放| 日韩av免费在线观看| 亚洲国产婷婷香蕉久久久久久| 国产精品日日做人人爱| 亚洲www永久成人夜色| 日韩中文字幕第一页| 日韩福利伦理影院免费| 亚洲国模精品一区| 91久久久久久久久久久久久| 疯狂做受xxxx高潮欧美日本| 亚洲第一免费播放区| 久久久久久中文字幕| 久久久最新网址| 日韩一二三在线视频播| 亚洲精选在线观看| 亚洲免费视频在线观看| 久久久久久亚洲精品不卡| 一色桃子一区二区| 2019中文在线观看| 国产精品免费一区| 狠狠操狠狠色综合网| 欧美老女人www| 欧美三级欧美成人高清www| 国产精品第七影院| 最近2019年日本中文免费字幕| 久久亚洲电影天堂| 日韩二区三区在线| 欧美日韩视频免费播放| 日日骚av一区| 久久精品国产69国产精品亚洲| 国产精品美女在线观看| 久久精品色欧美aⅴ一区二区| 韩国19禁主播vip福利视频| 欧美亚洲成人网| 色综久久综合桃花网| 狠狠爱在线视频一区| 亚洲精品久久久久中文字幕欢迎你| 欧美日韩亚洲精品内裤| 欧美一区二粉嫩精品国产一线天| 亚洲天堂成人在线| 久久精品国产亚洲精品2020| 亚洲第一在线视频| 精品国产91乱高清在线观看| 成人免费网站在线看| 久久久久久久久久久成人| 国产日韩欧美电影在线观看| 热99久久精品| 伊人久久五月天| 伊人男人综合视频网| 亚洲女同性videos| 亚洲国产女人aaa毛片在线| 国产精品久久久久免费a∨| 亚洲成人久久电影| 精品国产视频在线| 国产成人一区二区在线| 欧美性理论片在线观看片免费| 萌白酱国产一区二区| 久久成年人免费电影| 亚洲综合中文字幕在线| 亚洲国产精品99| 久久中国妇女中文字幕| 亚洲黄色av女优在线观看| 欧美精品免费播放| 国模精品一区二区三区色天香| 亚洲精品乱码久久久久久金桔影视| 午夜精品久久久久久99热软件| 亚洲国产女人aaa毛片在线| 精品福利免费观看| 在线观看欧美日韩国产| 在线视频欧美日韩| 午夜精品久久久久久久99黑人| 懂色av影视一区二区三区| 久久久久国产视频| 国产日韩在线视频| 日本一本a高清免费不卡| 久久久91精品| 亚洲小视频在线观看| 久久久伊人日本| 久久天堂av综合合色| 精品欧美国产一区二区三区| 91久久精品视频| 日本三级韩国三级久久| 久久亚洲春色中文字幕| 日韩性生活视频| 一区二区欧美在线| 色婷婷亚洲mv天堂mv在影片| 亚洲综合大片69999| 欧美日产国产成人免费图片| 成人网中文字幕| 亚洲男人第一网站| 欧美午夜精品久久久久久浪潮| 欧美在线视频免费| 综合激情国产一区|