XmlSerializerConfigurationSectionHandler

Altair na aspnet.cz predloni napsal clanek Vytvoření vlastní konfigurační sekce ve Web.Config. Jedina nevyhoda toho pristupu je, ze clovek musi rucne psat konstruktor, ktery z XmlNode vytvori nas objekt. Protoze jsem prilis liny a nebavi me menit kod na spouste mist pokazde, kdyz chci pridat dalsi polozku, napsal jsem nasledujici tridu. Ta vyuziva XML serializace, takze trida drzici nase konfiguracni data je zaroven predpisem, jak je z app.configu nacist.

public abstract class XmlSerializerConfigurationSectionHandler<T> : IConfigurationSectionHandler where T : class, new()
{
    object IConfigurationSectionHandler.Create(object parent, object configContext, XmlNode section)
    {
        return serializer.Deserialize(new XmlNodeReader(section)) as T;
    }

    public static T GetConfiguration(string sectionName)
    {
        return ConfigurationManager.GetSection(sectionName) as T;
    }

    private static readonly XmlSerializer serializer = new XmlSerializer(typeof(T));
}

Pouziti je velice jednoduche. Nejprve si vytvorime oatributovanou tridu EmailSettings, ktera bude obsahovat nase konfiguracni data.

[XmlRoot("mailConfig")]
public class EmailSettings
{
    [XmlElement("from")]
    public EmailIdentity From;

    [XmlElement("to")]
    public EmailIdentity To;

    [XmlElement("smtpServer")]
    public string SmtpServer;

    public class EmailIdentity
    {
        [XmlAttribute("name")]
        public string Name;

        [XmlAttribute("address")]
        public string Address;

        public override string ToString()
        {
            return string.Format("\"{0}\" <{1}>", Name, Address);
        }
    }
}

A dale zdedime uplne primitivni tridu z XmlSerializerConfigurationSectionHandler, abychom do configu nemuseli vypisovat dlouhe jmeno genericke tridy:

public class EmailSettingsConfigSection : XmlSerializerConfigurationSectionHandler<EmailSettings>
{
}

Pro vetsi pohodli muzeme do tridy EmailSettings pridat statickou vlastnost Current, ktera zavola nas handler a vrati objekt pro nejakou defaultni sekci:

public static EmailSettings Current
{
    get { return EmailSettingsConfigSection.GetConfiguration("mailConfig"); }
}

A to je vse. Posledni co zbyva, je pridat nasi sekci do configu:

<configSections>
  <section name="mailConfig" type="jachymko.Blog.EmailSettingsConfigHandler, Test" />
</configSections>

...a poslat mail:

MailMessage mail = new MailMessage();
mail.From = EmailSettings.Current.From.ToString();
mail.To = EmailSettings.Current.To.ToString();
mail.Subject = "HA HA HA!";

SmtpClient smtp = new SmtpClient(EmailSettings.Current.SmtpServer);
smtp.Send(mail);
Zveřejněno 12 června 07 02:00 by jachymko
Vedeno pod: ,

Komentář

# ernest said on června 13, 2007 11:42:

great

nebýt líných lidí, lezli bychom po stromech :)

# Karel Kral said on prosince 21, 2007 12:34:

Diky, moc se mi to hodilo. Vyborna vec, dlouho jsem nevedel, jak na to.

# Karel Král said on ledna 23, 2008 11:31:

Prosímtě, už několik hodin zápasím s pokusem načíst z konfigurace pomocí tvého handleru můj objekt. Problém je v tom, že nevím, v jakém formátu mám zapsat můj objekt do app.config. Pokud tam zkopíruji objekt ve tvaru, který dostanu po serializer.Serialize, není to ono.

Mohl bys uvést jako příklad tvou konfigurační sekci pro načtení EmailSettings?

# Hynek said on listopadu 7, 2008 21:32:

Do sekce jsem dal objekt ve tvaru, co vrací Serialize a pak to funguje za předpokladu, že v metodě Create místo section použiju:

return serializer.Deserialize( new XmlNodeReader( section.FirstChild ) ) as T;

Neregistrovaní uživatele nemužou přidávat komentáře.
Vyvojar.cz na prodej!