Personnalisé Simple section de configuration avec la collection de .NET4
Je suis en train d'écrire un très simple section de configuration personnalisée pour un .NET4 application. Mon but est: est-ce
<configuration>
<configSections>
<section name="myServices" type="My.ConfigSection, My.Assembly" />
</configSections>
<myServices>
<add name="First" />
<add name="Second" />
</myServices>
</configuration>
Cependant, je reçois un ConfigurationErrorsException
: "Méconnu élément "ajouter" quand je l'appelle ConfigurationManager.GetSection("myServices")
. J'ai été à regarder pendant un certain temps maintenant, mais qui n'ont pas encore appris ce que je fais mal. Ci-dessous mon code. C'est trois classes: ConfigSection
, MyServiceSettingsCollection
et MyServiceSettings
.
Premier de la classe qui représente la totalité de la section de configuration. Il a un nom par défaut collection de type MyServiceSettingsCollection
. Le IsDefaultCollection
propriété devrait me permettre d'ajouter directement à ma collection, à partir de l'élément racine.
public sealed class ConfigSection : ConfigurationSection
{
private static readonly ConfigurationProperty _propMyServices;
private static readonly ConfigurationPropertyCollection _properties;
public static ConfigSection Instance { get { return _instance; } }
static ConfigSection()
{
_propMyServices = new ConfigurationProperty(
null, typeof(MyServiceSettingsCollection), null,
ConfigurationPropertyOptions.IsDefaultCollection);
_properties = new ConfigurationPropertyCollection { _propMyServices };
}
[ConfigurationProperty("", IsDefaultCollection = true)]
public MyServiceSettingsCollection MyServices
{
get { return (MyServiceSettingsCollection) base[_propMyServices]; }
set { base[_propMyServices] = value; }
}
protected override ConfigurationPropertyCollection Properties
{ get { return _properties; } }
}
Prochaine, la collection de la classe elle-même. Il est de type AddRemoveClearMap
.
[ConfigurationCollection(typeof(MyServiceSettings),
CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]
public sealed class MyServiceSettingsCollection : ConfigurationElementCollection
{
public MyServiceSettings this[int index]
{
get { return (MyServiceSettings) BaseGet(index); }
set
{
if (BaseGet(index) != null) { BaseRemoveAt(index); }
BaseAdd(index, value);
}
}
public new MyServiceSettings this[string key]
{
get { return (MyServiceSettings) BaseGet(key); }
}
protected override ConfigurationElement CreateNewElement()
{
return new MyServiceSettings();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((MyServiceSettings) element).Key;
}
}
Et enfin une classe pour les éléments de la collection. Pour l'instant, cette classe possède une propriété, mais il n'y aura plus tard (ce qui m'empêche d'utiliser NameValueSectionHandler
).
public class MyServiceSettings : ConfigurationElement
{
private static readonly ConfigurationProperty _propName;
private static readonly ConfigurationPropertyCollection properties;
static MyServiceSettings()
{
_propName = new ConfigurationProperty("name", typeof(string), null, null,
new StringValidator(1),
ConfigurationPropertyOptions.IsRequired |
ConfigurationPropertyOptions.IsKey);
properties = new ConfigurationPropertyCollection { _propName };
}
[ConfigurationProperty("name", DefaultValue = "",
Options = ConfigurationPropertyOptions.IsRequired |
ConfigurationPropertyOptions.IsKey)]
public string Name
{
get { return (string) base[_propKey]; }
set { base[_propKey] = value; }
}
protected override ConfigurationPropertyCollection Properties
{ get { return properties; } }
}
OriginalL'auteur Ronald Wildenberg | 2011-08-15
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai trouvé apparemment aléatoire correctif. Au lieu de cela:
vous devez utiliser:
Aucune idée de ce qu'est la différence entre les deux. Pour moi, ils ont l'air étonnamment similaire... ou au moins, il n'y a aucune suggestion n'importe où, pourquoi l'un est préférable à l'autre.
C'est étrange. Les deux
IsDefaultCollection
etOptions
de travail pour moi. Mais avoir une chaîne vide pour le nom de la propriété semble être obligatoire.En regardant la source de référence pour ConfigurationPropertyAttribute.cs, IsDefaultCollection propriété est juste un wrapper sur les Options de la propriété flags - referencesource.microsoft.com/#System.Configuration/System/...
OriginalL'auteur Ronald Wildenberg
il semble il vous manque quelque chose de semblable à ce
pour plus d'informations, voir http://msdn.microsoft.com/en-us/library/system.configuration.configurationcollectionattribute.aspx
une autre option - voir la dernière entrée dans le sitepoint.com/forums/net-141/...
Avons vu que les post sur le forum également. Avant de poser cette question, j'ai déjà utilisé tous mes Google compétences pour trouver une réponse 🙂
OriginalL'auteur Yahia
Depuis que j'ai passé une bonne quantité de temps sur ce sujet, j'ai pensé ajouter un monde réel exemple, j'ai juste mis en œuvre dans ce commit: https://github.com/rhythmagency/formulate/commit/4d2a95e1a82eb6b3500ab0869b8f8b15bd3deaa9
Ici a été mon objectif pour mon site web.config (j'ai pu le réaliser):
C'est la classe la plus élevée au niveau des "modèles" de section de configuration:
Voici la prochaine niveau de, la classe de collection:
Et voici le niveau le plus profond de la classe (les modèles):
L'important pour moi était d'avoir la chaîne vide dans le
ConfigurationPropertyAttribute
et réglage IsDefaultCollection de vrai. En passant, j'ai mis ma config dans un fichier externe qui ressemble à ceci:Et dans ce cas, mon web.config ressemble à ceci:
Pensé que je voudrais mentionner que, dans le cas où quelqu'un d'autre essaie de l'ajouter à un fichier externe (c'est un peu la non-intuitif que le niveau de la racine de l'élément dans le fichier externe est le même que le externalisés élément à partir du web.config).
OriginalL'auteur Nicholas Westby