2009-10-30 3 views
3

J'ai déjà conçu un gestionnaire de section personnalisé, mais je suis confronté à un problème auquel je n'arrive pas à penser. J'ai une section de configuration comme ceci:Personnalisé web.config Section Handler

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> 
    <configSections> 
     <section name="providers" requirePermission="false" type="MyProject.Configuration.ProvidersSection"/> 
    </configSections> 

    <providers> 
     <provider name="products"> 
      <queries> 
       <add name="insert" value="InsertProduct" /> 
       <add name="retrieve" value="GetProduct" /> 
       <add name="collect" value="GetProducts" /> 
       <add name="update" value="UpdateProduct" /> 
       <add name="delete" value="DeleteProduct" /> 
      <queries> 
     </provider> 
     <provider name="tasks"> 
      <queries> 
       <add name="insert" value="InsertTask" /> 
       <add name="retrieve" value="GetTaskById" /> 
       <add name="collect" value="GetMultipleTasks" /> 
       <add name="update" value="UpdateTask" /> 
       <add name="delete" value="DeleteTask" /> 
      <queries> 
     </provider> 
     <provider name="events"> 
      <queries> 
       <add name="insert" value="AddEvent" /> 
       <add name="retrieve" value="GetEvent" /> 
       <add name="collect" value="GetEvents" /> 
       <add name="update" value="UpdateEvent" /> 
       <add name="delete" value="DeleteEvent" /> 
      <queries> 
     </provider> 
    </providers> 
</configuration> 

J'ai créé les classes de traitement suivantes:

using System.Configuration; 

namespace MyProject.Configuration 
{ 
    public class ProvidersSection : ConfigurationSection 
    { 
     public new Element this[string key] 
     { 
      get 
      { 

      } 
     } 
    } 

    [ConfigurationCollection(typeof(ProviderElement))] 
    public class ProvidersCollection : ConfigurationElementCollection 
    { 

     protected override ConfigurationElement CreateNewElement() 
     { 
      return new ProviderElement(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) 
     { 
      return element.ElementInformation.Properties["name"].Value; 
     } 

     public ProviderElement this[string key] 
     { 
      get 
      { 
       return (ProviderElement)base.BaseGet(key); 
      } 
     } 
    } 

    public class ProviderElement : ConfigurationElement 
    { 
     public string this[string name] 
     { 
      get 
      { 
       return string.Empty; 
      } 
     } 
    } 
} 

Quel code dois-je dans ces classes afin d'exécuter avec succès le code suivant?

string query = ProvidersSection["tasks"].Queries["Insert"]; 

Répondre

4

Vous devriez regarder dans ConfigurationElementCollection et KeyValueConfigurationCollection pour les éléments que vous souhaitez utiliser comme une collection. Dans ce cas, vous devrez créer une collection d'éléments, chaque élément ayant une KeyValueConfigurationCollection. Ainsi, au lieu de la configuration XML que vous avez ci-dessus, vous aurez quelque chose comme ceci:

<providers> 
    <provider key="products"> 
     <queries> 
      <add key="whatever" value="stuff" /> 
      ...etc... 
     <queries> 
    <provider> 
</providers> 

Vous pouvez réutiliser l'élément « requêtes », qui sera votre KeyValueConfigurationCollection, pour chaque « fournisseur ».

Une recherche rapide sur Google a donné this article on MSDN, ce qui peut également être utile.

Modifier - exemple de code

Votre définition de la partie racine sera comme ceci:

public class ProviderConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("Providers",IsRequired = true)] 
    public ProviderElementCollection Providers 
    { 
     get{ return (ProviderElementCollection)this["Providers"]; } 
     set{ this["Providers"] = value; } 
    } 
} 

Ensuite, vos fournisseurs ElementCollection:

public class ProviderCollection : ConfigurationElementCollection 
{ 
    public ProviderElement this[object elementKey] 
    { 
     get { return BaseGet(elementKey); } 
    } 

    public void Add(ProviderElement provider) 
    { 
     base.BaseAdd(provider); 
    } 

    public override ConfigurationElementCollectionType CollectionType 
    { 
     get { return ConfigurationElementCollectionType.BasicMap; } 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new ProviderElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((ProviderElement)element).Key; 
    } 

    protected override string ElementName 
    { 
     get { return "Provider"; } 
    } 
} 

Ensuite, votre élément Fournisseur:

public class Provider : ConfigurationElement 
{ 
    [ConfigurationProperty("Key",IsRequired = true, IsKey = true)] 
    public string Key 
    { 
     get { return (string) this["Key"]; } 
     set { this["Key"] = value; } 
    } 

    [ConfigurationProperty("Queries", IsRequired = true)] 
    public KeyValueConfigurationCollection Queries 
    { 
     get { return (KeyValueConfigurationCollection)this["Queries"]; } 
     set { this["Queries"] = value; } 
    } 
} 

Vous allez probablement avoir à jouer avec le KeyValueConfigurationCollection un peu pour le faire fonctionner correctement, mais je pense que ce serait l'idée générale. Ensuite, lorsque vous accédez à ce genre de choses dans votre code, vous feriez quelque chose comme ceci:

var myConfig = (ProviderConfiguration)ConfigurationManager.GetSection("Providers"); 
//and to access a single value from, say, your products collection... 
var myValue = myConfig.Providers["Products"].Queries["KeyForKeyValuePairing"].Value; 

espoir qui aide. Maintenant, ne me demandez pas de le traduire en VB :-D

+0

Merci pour votre réponse rapide. J'apprécie grandement votre approche efficace. J'ai réussi à comprendre comment gérer les collections au sein d'un même fournisseur. Cependant, comment puis-je rendre ma classe "ProvidersSection" un SectionHandler ainsi qu'un ConfigurationElementCollection? –

+0

Je suppose une autre façon de poser cette question est, "Comment puis-je créer une collection d'objets ConfigurationElementCollection mappage à chaque fournisseur au sein du SectionHandler? –

+0

Édité ma réponse avec le code –

Questions connexes