1

J'aimerais utiliser l'EntLib 4.1 dans mon projet actuel, en particulier Unity 1.2 et le VAB. Mon application est une application SaaS, j'ai donc pris la décision de stocker les fichiers de configuration spécifiques aux locataires dans la base de données, à charger lors de la connexion des locataires. Ces fichiers incluent la configuration VAB et la configuration Unity, ainsi que d'autres paramètres spécifiques au client hébergé.Lecture de la configuration EntLib 4.1 à partir d'une chaîne XML en mémoire

Je ne trouve aucun moyen pratique d'utiliser simplement une chaîne XML comme information de configuration pour le VAB. J'ai d'abord pensé que je devais créer une implémentation personnalisée de IConfigurationSource, mais j'ai réalisé que je devais dupliquer la logique d'analyse déjà présente dans la classe FileConfigurationSource. La pensée suivante a été que je pourrais créer une nouvelle classe dérivée de FileConfigurationSource, et utiliser simplement la nouvelle classe comme proxy pour passer l'information de config au lieu d'une chaîne avec le chemin du fichier, mais je ne pouvais pas voir comment remplacer l'endroit où le fichier est chargé.

J'ai extrait l'exemple de démarrage rapide de SqlConfigurationSource, mais ce n'est pas vraiment ce dont je pense avoir besoin.

Répondre

2

Voici la solution que je suis venu avec pour résoudre ce problème:

J'ai créé une nouvelle classe, XmlConfigurationSource, qui dérive de IConfigurationSource:

public class XmlConfigurationSource : IConfigurationSource 
    { 
     private string _xml; 

     public XmlConfigurationSource(string xml) 
     { 
      _xml = xml; 
     } 
     //Other IconfigurationSource members omitted for clarity. 
     //Also, I'm not using them so I didn't implement them 

     public ConfigurationSection GetSection(string sectionName) 
     { 
      //Since my solution is specific to validation, I'm filtering for that here. 
      //This could easily be refactored for other EntLib blocks 
      //SerializableConfigurationSection object instead of XmlValidatorSettings 
      if (sectionName != "validation") 
       return null; 

      XmlValidatorSettings x = new XmlValidatorSettings(_xml.ToString()); 

      return x;    
     } 
    } 

La classe XmlValidatorSettings était en quelque sorte la clé pour que cela fonctionne. Il est une classe très simple provenant de ValidationSettings:

public class XmlValidatorSettings : ValidationSettings 
    { 
     public XmlValidatorSettings(string configXml) 
     { 
      XDocument doc = XDocument.Parse(configXml); 
      DeserializeSection(doc.CreateReader()); 
     } 
    } 

Pour utiliser ce code, vous aurez besoin de faire référence à la EntLib commune et validation DLL. J'espère que d'autres personnes en bénéficieront!

+0

Je ne peux pas quantifier combien de temps cela m'a sauvé! Je vous remercie. – SergioL