2

我已經爲我的應用程序編寫了一個自定義配置,但我沒有得到正確的方式來確定ConfigurationSele中是否存在任何ConfigurationElement。如何確定「ConfigurationElement」在「ConfigurationSection」自定義配置設置上可用

這是我的自定義配置的app.config代碼

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <sectionGroup name="ApplicationsSettings" type="App.Configuration.ConfigurationGroup, App.Configuration.Core"> 
     <section name="DataExtractorSettings" type="App.Configuration.DataExtractorConfig, App.Configuration.Core" /> 
    </sectionGroup> 
    </configSections> 

    <ApplicationsSettings> 
    <DataExtractorSettings> 
     <executionLog> 
     <enabled value="Y" /> 
     <copyOnReportDirectory value="Y" /> 
     <logFilePath value="D:\MyBatchProcessLog\MasterDataExtractor" /> 
     </executionLog> 
     <eMail> 
     <fromEmailID value="[email protected]" /> 
     <webURL value="http://PROD/login.aspx" /> 
     </eMail> 

    <!--<parallelProcessing> 
     <allowed value="Y" /> 
     <threds value="6" /> 
     </parallelProcessing>--> 

    </DataExtractorSettings> 

    </ApplicationsSettings> 

</configuration> 

類DataExtractorConfig

namespace App.Configuration 
{ 
    [SettingProperty(Name: "dataExtractorSettings")] 
    public class DataExtractorConfig : ConfigurationSection 
    { 
     [ConfigurationProperty("executionLog")] 
     public LogConfig ExecutionLog 
     { 
      get 
      { 
       if (base["executionLog"] != null) 
       { 
        return (LogConfig)base["executionLog"]; 
       } 
       else 
       { 
        return null; 
       } 

      } 
     } 

     [ConfigurationProperty("parallelProcessing")] 
     public ParallelProcessConfig ParallelProcessing 
     { 
      get 
      { 
       if (base["parallelProcessing"] != null) 
       { 
        return (ParallelProcessConfig)base["parallelProcessing"]; 
       } 
       else 
       { 
        return null; 
       } 
      } 
     } 

     [ConfigurationProperty("eMail")] 
     public EmailConfig Email 
     { 
      get 
      { 
       if (base["eMail"] != null) 
       { 
        return (EmailConfig)base["eMail"]; 
       } 
       else 
       { 
        return null; 
       } 
      } 
     } 
    } 
} 

這是爲了讀取App.config中設置文件

public static class ConfigurationReader 
{ 

private const string _customSeetingParentNode = "ApplicationsSettings"; 

public static T GetSettings<T>(string configFileName = "AppSettings.xml", string sectionGroupName = "ApplicationsSettings") 
{ 
    System.Configuration.Configuration config; 
    ConfigurationSection customConfig; 
    ExeConfigurationFileMap fileMap; 
    T result; 
    string settingKey; 

    try 
    { 
     fileMap = new ExeConfigurationFileMap(); 
     fileMap.ExeConfigFilename = string.Format("{0}\\{1}", AppDomain.CurrentDomain.BaseDirectory, configFileName); 

     config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
     var caSetting = typeof(T).GetCustomAttributes(typeof(SettingProperty), false); 

     string sectionName; 
     dynamic dynSettingClass = null; 
     if (caSetting != null && caSetting.Length > 0) 
     { 
      settingKey = (caSetting[0] as SettingProperty).Name; 
      sectionName = string.Concat(_customSeetingParentNode, "/", settingKey); 
      customConfig = (ConfigurationSection)config.GetSection(sectionName); 

      if (customConfig != null && customConfig.ElementInformation.IsPresent) 
      { 
       //Here how do I determine the <parallelProcessing> setting is present or not in configuration file, 
       //like currently it is commented in app config file so the parallelProcessingExists should set with false 

       //bool parallelProcessingExists = ? 

       dynSettingClass = customConfig; 
      } 
      else 
      { 
       dynSettingClass = Activator.CreateInstance(typeof(T)); 
      } 

     } 
     else 
     { 
      dynSettingClass = Activator.CreateInstance(typeof(T)); 
     } 

     result = (T)Convert.ChangeType(dynSettingClass, typeof(T)); 
     return result; 
    } 
    finally 
    { 
     config = null; 
     customConfig = null; 
     fileMap = null; 
    } 

} 
} 

這裏的代碼是從app.config文件讀取設置的代碼

DataExtractorConfig settigns = ConfigurationReader.GetSettings<DataExtractorConfig>(); 

如何確定「並行處理」設置是否存在於配置文件中,就像當前它在應用程序配置文件中註釋一樣,因此parallelProcessingExists應該設置爲false。

+0

通常,您不需要確定它是否存在配置元素。你只需使用你聲明的默認值。 –

+0

@SimonMourier問題是我在配置文件中有一個常見的配置文件,它還具有「executionLog」,「eMail」和「parallelProcessing」節點,如果其他設置中沒有任何節點應該從共同部分。像例子「parallelProcessing」不存在於「DataExtractorSettings」部分,所以它應該從公共部分加載。 –

回答

2

您創建了DataExtractorConfig類,讓我們使用它。從GetSection方法返回的對象可以鑄造到DataExtractorConfig。現在您可以輕鬆訪問ParallelProcessing,Email,ExecutionLog屬性並檢查相應的配置節是否存在。例如:

var customConfig = (DataExtractorConfig)config.GetSection(sectionName); 

if (customConfig != null && customConfig.ElementInformation.IsPresent) 
{ 
    if(customConfig.ParallelProcessing.ElementInformation.IsPresent) 
    { 
     // TODO 
    } 
    else 
    { 
     // TODO 
    } 

    dynSettingClass = customConfig; 
} 
+0

謝謝@Michal它的作品:) –

相關問題