2

Ich habe eine benutzerdefinierte Konfiguration für meine Anwendung geschrieben, aber ich bekomme keine ordnungsgemäße Möglichkeit festzustellen, ob ein ConfigurationElement nicht in ConfigurationSection vorhanden ist.Wie zu bestimmen, "ConfigurationElement" ist verfügbar in "ConfigurationSection" benutzerdefinierte Konfigurationseinstellungen

das ist meine benutzerdefinierte Konfiguration app.config Code

<?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> 

Klasse 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; 
       } 
      } 
     } 
    } 
} 

Dies ist der Code, um die Einstellungen von Datei 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; 
    } 

} 
} 

Hier zu lesen ist ein Code zum Lesen der Einstellung aus der Datei app.config

Wie kann ich feststellen, dass die Einstellung "parallelProcessing" in der Konfigurationsdatei vorhanden ist oder nicht, so wie sie derzeit in der App-Konfigurationsdatei kommentiert ist, so dass die parallelProcessingExists mit false festgelegt werden sollte.

+0

Normalerweise müssen Sie nicht feststellen, ob ein Konfigurationselement vorhanden ist oder nicht. Sie verwenden nur den von Ihnen angegebenen Standardwert. –

+0

@SimonMourier das Problem ist, dass ich einen weiteren Abschnitt in der Konfigurationsdatei haben, die gemeinsame Konfiguration ist, hat es auch "executionLog", "eMail" & "parallelProcessing" Knoten, wenn eine der anderen Einstellung nicht Knoten, von denen geladen werden soll gemeinsamer Abschnitt. wie im Beispiel "parallelProcessing" ist nicht in "DataExtractorSettings" Abschnitt, so dass es von gemeinsamen Abschnitt laden sollte. –

Antwort

2

Sie haben DataExtractorConfig Klasse erstellt, also verwenden wir sie. Das Objekt, das von der Methode GetSection zurückgegeben wird, kann an DataExtractorConfig übergeben werden. Jetzt können Sie problemlos auf ParallelProcessing, Email, ExecutionLog Eigenschaften zugreifen und prüfen, ob entsprechende Konfigurationsabschnitte vorhanden sind. Zum Beispiel:

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

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

    dynSettingClass = customConfig; 
} 
+0

danke @Michal es funktioniert :) –

Verwandte Themen