Comment ajouter l’intellisense à une section de configuration personnalisée ?

Maintenant que vous savez définir une section de configuration personnalisée (cf. Comment créer sa propre section de configuration dans le web.config ?), il reste une chose importante pour tout développeur qui veut bien faire son travail (même si ne pas le faire n’est pas une mauvaise chose :-P). Cela est important pour les personnes qui suivent et qui n’ont pas besoin de détricoter le code pour savoir qui Param1 c’est pour configurer TrucMuche3246.

Le schéma

Alors voici comment on fait. Tout d’abord, on crée un nouveau schéma XML (.xsd) que l’on nomme de préférence <NomDeLaClasseDeSection>Schema. Puis on passe du côté édition du code (F7) et là on va décrire le schéma de notre section de configuration personnalisée.

Fenêtre de création d'un nouveau schéma XML dans Visual Studio 2013
Fenêtre de création d’un nouveau schéma XML dans Visual Studio 2013

Voici le code du schéma XML de la section personnalisée que je vous ai exposé dans l’article Comment créer sa propre section de configuration dans le web.config ?

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="PartnerConfigSectionSchema"
    targetNamespace="http://tempuri.org/PartnerConfigSectionSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/PartnerConfigSectionSchema.xsd"
    xmlns:mstns="http://tempuri.org/PartnerConfigSectionSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>  
  <xs:complexType name="partnerConfig_T">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element minOccurs="0" name="partner">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="add">
              <xs:complexType>
                <xs:attribute name="key" type="xs:string" use="optional" />
                <xs:attribute name="value" type="xs:string" use="optional" />
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
            <xs:element name="remove">
              <xs:complexType>
                <xs:attribute name="key" type="xs:string" use="optional" />
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
            <xs:element name="clear">
              <xs:complexType>
                <!--tag is empty-->
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
          </xs:choice>
          <xs:attribute name="Name" use="required" type="xs:string">
            <xs:annotation>
              <xs:documentation>The unique name of the partner</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Enabled" use="optional" default="false">
            <xs:annotation>
              <xs:documentation>Set to true to enabled the partner</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="ClientId" use="optional" type="xs:string">
            <xs:annotation>
              <xs:documentation>The client ID of the account to use for the partner's service(s)</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="ClientSecret" use="optional" type="xs:string">
            <xs:annotation>
              <xs:documentation>The client secret of the account to use for the partner's service(s)</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
        </xs:complexType>
      </xs:element>
    </xs:choice>
    <xs:attribute name="configSource" type="xs:string" use="optional" />
    <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
  </xs:complexType>

  <xs:element name="partnerConfig" type="partnerConfig_T" />
</xs:schema>

Et là c’est la panique :-D.

Mais non, faut pas se dire ça, y’a bien pire :-). Je vous explique :

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="PartnerConfigSectionSchema"
    targetNamespace="http://tempuri.org/PartnerConfigSectionSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/PartnerConfigSectionSchema.xsd"
    xmlns:mstns="http://tempuri.org/PartnerConfigSectionSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

Cette partie est la partie déclarative du schéma. Notamment son nom, qualifié dans la propriété id ensuite répercuté dans les définitions de schémas avec les propriétés targetNamespace, xlmns et xlmns:mstns.

<xs:complexType name="partnerConfig_T">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element minOccurs="0" name="partner">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="add">
              <xs:complexType>
                <xs:attribute name="key" type="xs:string" use="optional" />
                <xs:attribute name="value" type="xs:string" use="optional" />
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
            <xs:element name="remove">
              <xs:complexType>
                <xs:attribute name="key" type="xs:string" use="optional" />
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
            <xs:element name="clear">
              <xs:complexType>
                <!--tag is empty-->
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
          </xs:choice>
          <xs:attribute name="Name" use="required" type="xs:string">
            <xs:annotation>
              <xs:documentation>The unique name of the partner</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Enabled" use="optional" default="false">
            <xs:annotation>
              <xs:documentation>Set to true to enabled the partner</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="ClientId" use="optional" type="xs:string">
            <xs:annotation>
              <xs:documentation>The client ID of the account to use for the partner's service(s)</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="ClientSecret" use="optional" type="xs:string">
            <xs:annotation>
              <xs:documentation>The client secret of the account to use for the partner's service(s)</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
        </xs:complexType>
      </xs:element>
    </xs:choice>
    <xs:attribute name="Name" use="optional" type="xs:string">
      <xs:annotation>
        <xs:documentation>The name of partners group</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="configSource" type="xs:string" use="optional" />
    <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
  </xs:complexType>

Voici le plus gros bout ^^ mais pas forcément compliqué à comprendre si vous avez déjà fait de la définition de schéma XML. Décomposons pour retrouver nos éléments

      <xs:element minOccurs="0" name="partner">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="add">
              <xs:complexType>
                <xs:attribute name="key" type="xs:string" use="optional" />
                <xs:attribute name="value" type="xs:string" use="optional" />
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
            <xs:element name="remove">
              <xs:complexType>
                <xs:attribute name="key" type="xs:string" use="optional" />
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
            <xs:element name="clear">
              <xs:complexType>
                <!--tag is empty-->
                <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
              </xs:complexType>
            </xs:element>
          </xs:choice>
          <xs:attribute name="Name" use="required" type="xs:string">
            <xs:annotation>
              <xs:documentation>The unique name of the partner</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Enabled" use="optional" default="false">
            <xs:annotation>
              <xs:documentation>Set to true to enabled the partner</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="ClientId" use="optional" type="xs:string">
            <xs:annotation>
              <xs:documentation>The client ID of the account to use for the partner's service(s)</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="ClientSecret" use="optional" type="xs:string">
            <xs:annotation>
              <xs:documentation>The client secret of the account to use for the partner's service(s)</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/>
        </xs:complexType>
      </xs:element>

Commençons par la section en bleue, on y retrouve les propriétés de notre PartnerConfigurationElement avec cependant un attribut supplémentaire :

          <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict"/

Cet attribut a une fonction spéciale. Il permet d’appliquer des règles de transformations sur les éléments dans le cadre des transformations de fichiers de configuration comme vous pouvez le faire sur la section AppSettings par exemple.

Continuons avec les sections verte, rouge et orange.

  • La section verte permet de décrire l’ajout d’un élément dans la collection Parameters de l’object PartnerConfigurationElement.
  • La section rouge permet le retrait d’une valeu.
  • Et enfin la section orange, de mettre à zéro la collection.

Maintenant que vous voyez un peu mieux comment cela fonctionne, on peut en déduire que ce qui reste à voir

<xs:complexType name="partnerConfig_T">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      ...
    </xs:choice>
<xs:complexType>

Constitue la définition de la collection d’élément PartnerConfigurationCollection ainsi que la déclaration dans le schéma du type d’élément partnerConfig_T qui équivaut donc au type C# PartnerConfigSection.

Maintenant que nous avons défini le type de section. Il faut déclarer l’élément dans le schéma qui va être de ce type préalablement déclaré. Et c’est ce à quoi sert

  <xs:element name="partnerConfig" type="partnerConfig_T" />

Il indique que dans le schéma, nous avons un élément de tag partnerConfig typé partnerConfig_T.

La déclaration et l’usage du schéma

Maintenant que vous avez votre schéma XSD, il faut l’utiliser et surtout indiquer à l’éditeur des fichiers de configuration qu’il doit prendre en charge un schéma de configuration supplémentaire pour justement apporter l’intellisence nécessaire à votre section.

Pour cela, ouvrez le fichier web.config. Allez dans les propriétés (F4) et ouvrez la collection Schemas. Une fenêtre s’affiche et expose tous les schémas XML disponibles. Cliquez sur le bouton Add pour ajouter votre schéma personnalisé et allez chercher directement le fichier .xsd.

Boîte des propriétés d'un fichier de configuration
Boîte des propriétés d’un fichier de configuration
Liste des schémas disponibles
Liste des schémas disponibles

Dans le web.config, lorsque vous créer une nouvelle section partnerConfig vous avez l’intellisence sur les attributs.

41_web_config_intellisense
Intellisence sur un attribut d’une section personnalisée

Conclusion

Vous êtes désormais capable d’ajouter de l’intellisence à votre section de configuration personnalisée alors prenez le temps de le faire. Cela aide beaucoup lorsque quelqu’un vous succède et cela permet également de documenter en quelque sorte ce qu’il y a dans le web.config ;-).

Publicités
Comment ajouter l’intellisense à une section de configuration personnalisée ?

Une réflexion sur “Comment ajouter l’intellisense à une section de configuration personnalisée ?

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s