Utilisation des attributs, des sections de configuration enfant et des contraintes
Il est également possible d'utiliser des attributs qui prennent automatiquement en charge la plomberie, tout en offrant la possibilité d'ajouter facilement des contraintes.
Je présente ici un exemple de code que j'utilise moi-même dans un de mes sites. Avec une contrainte, je dicte la quantité maximale d'espace disque qu'un utilisateur est autorisé à utiliser.
MailCenterConfiguration.cs :
namespace Ani {
public sealed class MailCenterConfiguration : ConfigurationSection
{
[ConfigurationProperty("userDiskSpace", IsRequired = true)]
[IntegerValidator(MinValue = 0, MaxValue = 1000000)]
public int UserDiskSpace
{
get { return (int)base["userDiskSpace"]; }
set { base["userDiskSpace"] = value; }
}
}
}
Ceci est configuré dans le web.config comme suit
<configSections>
<!-- Mailcenter configuration file -->
<section name="mailCenter" type="Ani.MailCenterConfiguration" requirePermission="false"/>
</configSections>
...
<mailCenter userDiskSpace="25000">
<mail
host="my.hostname.com"
port="366" />
</mailCenter>
Éléments enfants
L'élément xml enfant courrier électronique est créé dans le même fichier .cs que celui ci-dessus. Ici, j'ai ajouté des contraintes sur le port. Si le port est assigné à une valeur qui n'est pas dans cette plage, le runtime se plaindra lorsque la configuration sera chargée.
MailCenterConfiguration.cs :
public sealed class MailCenterConfiguration : ConfigurationSection
{
[ConfigurationProperty("mail", IsRequired=true)]
public MailElement Mail
{
get { return (MailElement)base["mail"]; }
set { base["mail"] = value; }
}
public class MailElement : ConfigurationElement
{
[ConfigurationProperty("host", IsRequired = true)]
public string Host
{
get { return (string)base["host"]; }
set { base["host"] = value; }
}
[ConfigurationProperty("port", IsRequired = true)]
[IntegerValidator(MinValue = 0, MaxValue = 65535)]
public int Port
{
get { return (int)base["port"]; }
set { base["port"] = value; }
}
Utilisez
Pour l'utiliser de manière pratique dans le code, il suffit d'instancier le MailCenterConfigurationObject. automatiquement lire les sections pertinentes du web.config.
MailCenterConfiguration.cs
private static MailCenterConfiguration instance = null;
public static MailCenterConfiguration Instance
{
get
{
if (instance == null)
{
instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter");
}
return instance;
}
}
AutreFichier.cs
public void SendMail()
{
MailCenterConfiguration conf = MailCenterConfiguration.Instance;
SmtpClient smtpClient = new SmtpClient(conf.Mail.Host, conf.Mail.Port);
}
Contrôle de la validité
J'ai mentionné précédemment que le runtime se plaint lorsque la configuration est chargée et que certaines données ne sont pas conformes aux règles que vous avez mises en place (par exemple dans MailCenterConfiguration.cs). J'ai tendance à vouloir connaître ces choses le plus tôt possible lorsque mon site démarre. Une façon de résoudre ce problème est de charger la configuration dans _Global.asax.cx.Application_Start_, si la configuration n'est pas valide, vous en serez informé au moyen d'une exception. Votre site ne démarrera pas et, à la place, des informations détaillées sur l'exception vous seront présentées dans la fenêtre de l'application. Écran jaune de la mort .
Global.asax.cs
protected void Application_ Start(object sender, EventArgs e)
{
MailCenterConfiguration.Instance;
}