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它的作品:) –

相关问题