2

Я написал пользовательскую конфигурацию для своего приложения, но у меня нет подходящего способа определить, нет ли какого-либо ConfigurationElement, отсутствующего в ConfigurationSection.Как определить «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 должен быть установлен с ложным.

+0

Обычно вам не нужно определять его, присутствует элемент конфигурации или нет. Вы просто используете указанное по умолчанию значение. –

+0

@SimonMourier проблема в том, что у меня есть еще один раздел в конфигурационном файле, который является общей конфигурацией, он также имеет узлы «executeLog», «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 это работает :) –

 Смежные вопросы

  • Нет связанных вопросов^_^