Armazenamento de valores em web.config - appSettings ou configSection - que é mais eficiente?
-
03-07-2019 - |
Pergunta
Eu estou escrevendo uma página que pode usar um par de temas diferentes, e eu estou indo para armazenar algumas informações sobre cada tema no web.config.
É mais eficiente para criar um novo sectionGroup e armazenar tudo em conjunto, ou apenas colocar tudo em appSettings?
solução configSection
<configSections>
<sectionGroup name="SchedulerPage">
<section name="Providers" type="System.Configuration.NameValueSectionHandler"/>
<section name="Themes" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections>
<SchedulerPage>
<Themes>
<add key="PI" value="PISchedulerForm"/>
<add key="UB" value="UBSchedulerForm"/>
</Themes>
</SchedulerPage>
Para valores de acesso na configSection, estou usando este código:
NameValueCollection themes = ConfigurationManager.GetSection("SchedulerPage/Themes") as NameValueCollection;
String SchedulerTheme = themes["UB"];
solução appSettings
<appSettings>
<add key="PITheme" value="PISchedulerForm"/>
<add key="UBTheme" value="UBSchedulerForm"/>
</appSettings>
Os valores acesso no appSettings, estou usando este código
String SchedulerTheme = ConfigurationManager.AppSettings["UBSchedulerForm"].ToString();
Solução
Para a configuração de configuração mais complexa, gostaria de usar uma seção de configuração personalizada que define claramente os papéis de cada seção, por exemplo
<appMonitoring enabled="true" smtpServer="xxx">
<alertRecipients>
<add name="me" email="me@me.com"/>
</alertRecipient>
</appMonitoring>
Em sua classe de configuração que você pode expor suas propriedades com algo como
public class MonitoringConfig : ConfigurationSection
{
[ConfigurationProperty("smtp", IsRequired = true)]
public string Smtp
{
get { return this["smtp"] as string; }
}
public static MonitoringConfig GetConfig()
{
return ConfigurationManager.GetSection("appMonitoring") as MonitoringConfig
}
}
Você pode, então, as propriedades de configuração de acesso da seguinte maneira a partir do seu código
string smtp = MonitoringConfig.GetConfig().Smtp;
Outras dicas
Não haverá nenhuma diferença mensurável em termos de eficiência.
AppSettings é ótimo se tudo que você precisa são pares nome / valor.
Para qualquer coisa mais complexa, vale a pena criar uma seção de configuração personalizada.
Para o exemplo que você menciona, eu usaria appSettings.
Não haverá diferença no desempenho, já que ConfigurationManager.AppSettings apenas chama GetSection ( "appSettings") de qualquer maneira. Se você vai precisar para enumerar todas as chaves, em seguida, uma seção personalizada será mais agradável do que enumerar todas appSettings e procurando algum prefixo nas teclas, mas por outro lado é mais fácil para furar a appSettings a menos que você precisa de algo mais complexo do que um NameValueCollection.