2010-06-10 10 views
1

J'ai 2 projets qui partagent des sections appSettinsg et config. Disons:Puis-je partager certaines sections de configuration dans un fichier app.config commun? .net

  • ProjectA possède son propre app.config qui contient ses sections de configuration/config uniques.
  • ProjectB Ditto ...

maintenant dans chaque app.config je veux pointer vers un troisième fichier .config partagé qui contient quelques appsettings communes et des sections de configuration, utilisé à la fois par ProjectA et B.

Je sais qu'il y a la propriété configSource que je peux utiliser pour référencer un fichier externe pour chaque configSection, cependant, par expérience, cette approche ne peut contenir qu'une section config par fichier externe (en définissant la configsection est définie comme son élément racine) . J'aimerais que le fichier «commun» en contienne plus d'un pour plus de commodité.

Est-ce possible?

Répondre

1

Vous pouvez regrouper tous vos paramètres dans votre propre section de configuration personnalisée. Ensuite, bien sûr, vous pouvez tout déplacer ensemble dans un fichier différent en utilisant l'attribut configSource que vous mentionnez ci-dessus.

Dans le cas des AppSettings, votre section de configuration personnalisée pourrait fusionner ses propres valeurs dans les AppSettings normaux (qui sont NameValueCollection) en utilisant la fonction Add. De cette façon, vous ne devriez pas avoir besoin de changer votre code client. En parallèle, voici une partie de ma classe de base que j'utilise pour ajouter l'attribut "externalConfigSource" à la plupart de mes éléments personnalisés afin de permettre la division de fichiers supplémentaires pour certains de mes sous-éléments (bien que ce soit peut-être éviter):

public class BaseConfigurationElement : ConfigurationElement 
{ 
    protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey) 
    { 
     var fileSource = reader.GetAttribute("externalConfigSource"); 
     if (!String.IsNullOrEmpty(fileSource)) 
     { 
      var file = new FileInfo(Path.Combine(AppDomainExtensions.ConfigurationFilePath(), fileSource)); 
      if (file.Exists) 
      { 
       using (var fileReader = file.OpenRead()) 
       { 
        var settings = new XmlReaderSettings(){ CloseInput = true, IgnoreProcessingInstructions = true, IgnoreWhitespace = true, IgnoreComments = true}; 
        using (var fileXmlReader = XmlReader.Create(fileReader, settings)) 
        { 
         var atStart = fileXmlReader.IsStartElement(); 
         base.DeserializeElement(fileXmlReader, serializeCollectionKey); 
        } 
       } 
       reader.Skip(); 
      } 
      else 
      { 
       throw new ConfigurationErrorsException("The file specified in the externalConfigSource attribute cannot be found", reader); 
      } 
     } 
     else 
     { 
      base.DeserializeElement(reader, serializeCollectionKey); 
     } 
    } 

    protected override bool OnDeserializeUnrecognizedAttribute(string name, string value) 
    { 
     if (name == "externalConfigSource") 
     { 
      return true; // Indicate that we do know it... 
     } 
     return base.OnDeserializeUnrecognizedAttribute(name, value); 
    } 
} 

public static class AppDomainExtensions 
{ 
    public static string ConfigurationFilePath() 
    { 
     return ConfigurationFilePath(AppDomain.CurrentDomain); 
    } 

    // http://stackoverflow.com/questions/793657/how-to-find-path-of-active-app-config-file 
    public static string ConfigurationFilePath(this AppDomain appDomain) 
    { 
     return Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); 
    } 
} 
+0

Je viens de voir votre commentaire ci-dessus que de nombreuses sections sont déjà des sections personnalisées configuration, le cas échéant, vous pouvez étendre à travailler avec ce code « externalConfigSource » mais vous auriez à déplacer le lecteur à la position appropriée dans le fichier pour localiser le début de votre élément. – Reddog