웹에서.config 및 app.config 파일에 사용자 정의 설정 노드 추가

경험이 있는 개발자들은 모두 개발하고 있다는 것을 안다.NET 응용 시 프로필을 이용하여 자주 사용되고 변화할 수 있는 정보를 저장할 수 있다. 예를 들어 로그 파일의 저장 경로, 데이터베이스 연결 정보 등이다. 그러면 생산 환경에서의 매개 변수 정보가 개발 환경과 일치하지 않아도 프로필을 바꾸고 원본 코드를 바꾸지 않고 다시 컴파일하는 것이 매우 편리하다.또한 우리는 일반적으로 노드에 응용 프로그램의 설정 정보를 저장하고 에 데이터베이스 연결 문자열 정보를 저장하기로 약정한다(본 블로그의 참조).위의 이러한 방법과 약속은 우리가 대부분의 개발에서 편의를 얻기에 충분하지만 일부 상황에서 일부 설정 정보는 그룹별로 분류하여 저장할 수 있다. 만약에 위의 방법을 사용하면 직관적이지 않을 뿐만 아니라 읽기에도 그다지 편리하지 않다. 다행이다.NET에서 이런 방법을 제공했습니다.Log4Net 또는 Enyim을 사용한 적이 있는 경우Caching의 친구는 다음 설정이 낯설지 않을 것입니다.
 

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

또는:
 

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

위에서 설정한 프로필이 나타나면'enyim.com'또는'log4net'이라는 노드를 찾을 수 있습니다. config 파일의 기본 노드에 속하지 않지만, 위의 설정을 통해 프로그램이 실행되면 오류가 발생하지 않습니다.이렇게 하면 관련 설정 정보도 분류하여 저장할 수 있다.여기서 주공은 간단한 예를 보여 준다. 이 예는 주공의 2006년부터 개발한 자용 소프트웨어(미화되지 않았기 때문에 무료로 발표하지 않았다)에서 유래한 것이다. 이 응용 프로그램의 connfig 파일에 나는 특유의 설정을 추가하여 자신의 노드, 앱을 추가했다.config 파일의 내용은 다음과 같습니다.
 

  
  
  
  
  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.   <configSections> 
  4.       <section name="SoftwareSettings" type="ImageAssistant.Configuration.SoftwareSettings, ImageAssistant" /> 
  5.   </configSections> 
  6.   <SoftwareSettings> 
  7.     <LoadSettings> 
  8.       <add key="LoadBmp" value="true"/> 
  9.       <add key="LoadJpg" value="true"/> 
  10.       <add key="LoadGif" value="true"/> 
  11.       <add key="LoadPng" value="false"/> 
  12.     </LoadSettings> 
  13.     <PathSettings SavePath="C:\ResizeImages\" SearchSubPath="true"/> 
  14.   </SoftwareSettings> 
  15.   <appSettings> 
  16.     <add key="LoadBmp" value="true"/> 
  17.     <add key="LoadJpg" value="true"/> 
  18.     <add key="LoadGif" value="true"/> 
  19.     <add key="LoadPng" value="false"/> 
  20.     <add key="IncludeSubPath"  value="true"/> 
  21.   </appSettings> 
  22.     
  23. </configuration> 

config 파일에서 우리는
를 사용하여 프로그램에 설정 파일의 Software Settings 노드에 대해 대응하는 클래스는 Image Assistant 프로그램이 Image Assistant에 집중되어 있음을 알려줍니다.Configuration.Software Settings 클래스, 그리고 노드에서 우리는 노드와 노드가 있는 것을 보았다. 그 중에서 는 하나의 노드 집합이고 여러 개의 하위 노드가 포함되어 있다. 이러한 관계를 명확하게 나타내기 위해 우리는 네 가지 종류를 추가해야 한다. 그것이 바로 Software Settings, Load Settings Collection, Load Settings Element과 Path Setting Element이다.제작의 편의를 위해 주공은 이 네 가지 종류의 코드를 하나의 물리 파일에 놓았는데 코드는 다음과 같다(시스템.Configuration.dll에 대한 인용을 추가하는 것을 주의한다).
 

  
  
  
  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Configuration;  
  6.  
  7. // :zhoufoxcn( )  
  8. // :2011-03-08  
  9. //blog:http://blog.csdn.net/zhoufoxcn  http://zhoufoxcn.blog.51cto.com  
  10. // : , , 。  
  11. namespace ImageAssistant.Configuration  
  12. {  
  13.     public sealed class LoadSettingsCollection : ConfigurationElementCollection  
  14.     {  
  15.         private IDictionary<stringbool> settings;  
  16.  
  17.         protected override ConfigurationElement CreateNewElement()  
  18.         {  
  19.             return new LoadSettingsElement();  
  20.         }  
  21.  
  22.         protected override object GetElementKey(ConfigurationElement element)  
  23.         {  
  24.             LoadSettingsElement ep = (LoadSettingsElement)element;  
  25.  
  26.             return ep.Key;  
  27.         }  
  28.  
  29.         protected override string ElementName  
  30.         {  
  31.             get 
  32.             {  
  33.                 return base.ElementName;  
  34.             }  
  35.         }  
  36.  
  37.         public IDictionary<stringbool> Settings  
  38.         {  
  39.             get 
  40.             {  
  41.                 if (settings == null)  
  42.                 {  
  43.                     settings = new Dictionary<stringbool>();  
  44.                     foreach (LoadSettingsElement e in this)  
  45.                     {  
  46.                         settings.Add(e.Key, e.Value);  
  47.                     }  
  48.                 }  
  49.                 return settings;  
  50.             }  
  51.         }  
  52.  
  53.         public bool this[string key]  
  54.         {  
  55.             get 
  56.             {  
  57.                 bool isLoad = true;  
  58.                 if (settings.TryGetValue(key, out isLoad))  
  59.                 {  
  60.                     return isLoad;  
  61.                 }  
  62.                 else 
  63.                 {  
  64.                     throw new ArgumentException(" '" + key + "' 。");  
  65.                 }  
  66.             }  
  67.         }  
  68.  
  69.     }  
  70.  
  71.     public class LoadSettingsElement : ConfigurationElement  
  72.     {  
  73.         [ConfigurationProperty("key", IsRequired = true)]  
  74.         public string Key  
  75.         {  
  76.             get { return (string)base["key"]; }  
  77.             set { base["key"] = value; }  
  78.         }  
  79.         [ConfigurationProperty("value", IsRequired = true)]  
  80.         public bool Value  
  81.         {  
  82.             get { return (bool)base["value"]; }  
  83.             set { base["value"] = value; }  
  84.         }  
  85.     }  
  86.  
  87.     public class PathSettingElement : ConfigurationElement  
  88.     {  
  89.         /// <summary>  
  90.         ///   
  91.         /// </summary>  
  92.         [ConfigurationProperty("SavePath", IsRequired = true)]  
  93.         public string SavePath  
  94.         {  
  95.             get { return (string)base["SavePath"]; }  
  96.             set { base["SavePath"] = value; }  
  97.         }  
  98.         /// <summary>  
  99.         ///   
  100.         /// </summary>  
  101.         [ConfigurationProperty("SearchSubPath", IsRequired = false, DefaultValue = true)]  
  102.         public bool SearchSubPath  
  103.         {  
  104.             get { return (bool)base["SearchSubPath"]; }  
  105.             set { base["SearchSubPath"] = value; }  
  106.         }  
  107.     }  
  108.  
  109.     /// <summary>  
  110.     ///  config  
  111.     /// </summary>  
  112.     public sealed class SoftwareSettings : ConfigurationSection  
  113.     {  
  114.         /// <summary>  
  115.         ///  SoftwareSettings LoadSettings  
  116.         /// </summary>  
  117.         [ConfigurationProperty("LoadSettings", IsRequired = true)]  
  118.         public LoadSettingsCollection LoadSettings  
  119.         {  
  120.             get { return (LoadSettingsCollection)base["LoadSettings"]; }  
  121.         }  
  122.  
  123.         /// <summary>  
  124.         ///  SoftwareSettings PathSettings ,  
  125.         /// </summary>  
  126.         [ConfigurationProperty("PathSettings", IsRequired = false)]  
  127.         public PathSettingElement PathSetting  
  128.         {  
  129.             get { return (PathSettingElement)base["PathSettings"]; }  
  130.             set { base["PathSettings"] = value; }  
  131.         }  
  132.  
  133.     }  

위 코드에서 ConfigurationProperty라는 속성을 볼 수 있습니다. 이것은 대응하는 속성이 config 파일에 있는 속성 이름을 표시하고, IsRequired는 필요한 속성인지, DefaultValue는 속성의 기본값을 표시합니다.처음에 우리는 다음과 같은 관계를 주의해야 한다. Software Settings: 루트 노드는 Configuration Section에서 계승된다.LoadSettingsCollection: 하위 노드의 집합으로ConfigurationElementCollection에서 계승됩니다.LoadSettingsElement: 하위 노드, ConfigurationElement에서 상속됩니다.PathSettingElement: 하위 노드, ConfigurationElement에서 상속됩니다.아래 코드를 작성한 후에 우리는 또 위의 클래스를 어떻게 사용해야 합니까?사실은 매우 간단하다.
 

  
  
  
  
  1. class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.             SoftwareSettings softSettings = ConfigurationManager.GetSection("SoftwareSettings"as SoftwareSettings;  
  6.  
  7.             foreach (string key in softSettings.LoadSettings.Settings.Keys)  
  8.             {  
  9.                 Console.WriteLine("{0}={1}", key, softSettings.LoadSettings[key]);  
  10.             }  
  11.             Console.WriteLine("SavePath={0},SearchSubPath={1}", softSettings.PathSetting.SavePath, softSettings.PathSetting.SearchSubPath);  
  12.             Console.ReadLine();  
  13.         }  
  14.     } 

이 프로그램의 실행 결과는 다음과 같습니다: LoadBmp=True LoadJpg=True LoadGif=True LoadPng=False SavePath=C:\ResizeImages\,SearchSubPath=True
총괄: 위의 config 파일에서 를 통해 비슷한 효과를 얻었지만 사용자 정의 노드를 통해 관련 응용 프로그램 설정을 쉽게 읽을 수 있고 유지보수도 편리하다.만약 개발 과정에서 본고에서 유사한 상황을 만나면 본고에서 기술한 방식을 취해도 무방하다.첨부 파일은 본문에서 사용하는 원본 코드입니다.
주공2011-03-08

좋은 웹페이지 즐겨찾기