2011-11-25 10 views
6

Sto leggendo le impostazioni da "App.config". Ho appena capito come lavorare con ConfigurationSection, ConfigurationElementCollection e ConfigurationelElement.Perché non posso convertire l'attributo in elemento nidificato?

App.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="notificationSettingsGroup"> 
       <section name="mailTemplates" type="Project.Lib.Configuration.MailTemplateSection, Project.Lib" 
        allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" requirePermission="false"/> 
     </sectionGroup>   
    </configSections> 
    <notificationSettingsGroup> 
     <mailTemplates> 
      <items> 
       <mailTemplate name="actionChain" subject="Subject bla-bla"> 
        <body>Body bla-bla</body> 
       </mailTemplate>     
      </items> 
     </mailTemplates> 
    </notificationSettingsGroup> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
</configuration> 

Il mio codice C#:

public class MailTemplateSection : ConfigurationSection 
{ 
    [ConfigurationProperty("items", IsDefaultCollection = false)] 
    public MailTemplateCollection MailTemplates 
    { 
     get { return (MailTemplateCollection)this["items"]; } 
     set { this["items"] = value; } 
    } 
} 

[ConfigurationCollection(typeof(MailTemplateElement), AddItemName = "mailTemplate", 
    CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)] 
public class MailTemplateCollection : ConfigurationElementCollection 
{ 
    protected override ConfigurationElement CreateNewElement() 
    { 
     return new MailTemplateElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((MailTemplateElement) element).Name; 
    } 
} 

public class MailTemplateElement : ConfigurationElement 
{ 
    [ConfigurationProperty("name", DefaultValue = "action", IsKey = true, IsRequired = true)] 
    public string Name 
    { 
     get { return (string)this["name"]; } 
     set { this["name"] = value; } 
    } 

    [ConfigurationProperty("subject", DefaultValue = "Subject", IsKey = false, IsRequired = true)] 
    public string Subject 
    { 
     get { return (string)this["subject"]; } 
     set { this["subject"] = value; } 
    } 

    [ConfigurationProperty("body", DefaultValue = "Body", IsKey = false, IsRequired = true)] 
    public string Body 
    { 
     get { return (string)this["body"]; } 
     set { this["body"] = value; } 
    } 
} 

E il codice di lavoro:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Configuration config = 
      ConfigurationManager.OpenExeConfiguration(
      ConfigurationUserLevel.None); 

     var mailTemplatesSection = 
      config.GetSection("notificationSettingsGroup/mailTemplates") as MailTemplateSection; 

    } 
} 

Tutte le opere, quando sto dichiarando campi come attributi in XML. Ma quando provo a convertire gli attributi in elementi nidificati - "Corpo 'proprietà' non è un ConfigurationElement" si verifica l'errore.

Cosa sto sbagliando?

+0

Fare riferimento a questo [come utilizzare l'elemento di testo anziché l'attributo nella configurazione personalizzata] (http://stackoverflow.com/questions/5078758/can-i-add-a-textnode-instead-of-an-attribute-in -a-net-configurationsection) –

risposta

3

Perché è necessario creare tipi personalizzati e derivarli da ConfigurationElement per utilizzarli come elementi nel file di configurazione. Tutti i tipi semplici sono sempre scritti come attributi. Per esempio:

public class Body : ConfigurationElement 
{ 
    [ConfigurationProperty("value", DefaultValue = "Body", IsKey = true, IsRequired = true)] 
    public string Value{get;set;} 
} 

questo vi permetterà di scrivere

<body value="some val"/> 

nella vostra configurazione.

+0

Vladimir, voglio memorizzare _large text_ nell'attributo "body", quindi non voglio memorizzare questi dati nell'attributo. IMHO, i dati di grandi dimensioni devono essere memorizzati all'interno dei tag. – lewis

+3

I testi di grandi dimensioni non devono essere memorizzati in App.config. Utilizza il database o il formato personalizzato. Potrebbe essere facilmente un formato generato da XmlSerializer, per il quale è possibile creare classi e controllare completamente la modalità di serializzazione dei dati. –

Problemi correlati