2011-01-24 12 views
10

Al acceder appsettings de la aplicación actual, aparece un NameValueCollection:.net AppSettings archivo de configuración: NameValueCollection vs KeyValueConfigurationCollection

NameValueCollection settings = 
    ConfigurationManager.AppSettings; 

Al acceder appsettings de otra aplicación, aparece un KeyValueConfigurationCollection:

KeyValueConfigurationCollection settings = 
    ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings; 

  1. ¿Hay alguna razón para que estos dos métodos (ConfigurationManager.AppSettings y AppSettingsSection.Settings) tienen tipos de devolución similares pero diferentes (e incompatibles)? ¿Tal vez estoy usando un método obsoleto en uno de los dos casos?

  2. ¿Hay una forma fácil de obtener el mismo tipo en ambos casos, es decir, para obtener NameValueCollection para appSettings de otra aplicación o KeyValueConfigurationCollection para appSettings de la aplicación actualmente en ejecución?


actualización: Para la pregunta 2, he encontrado la siguiente manera de conseguir la configuración de la actualmente en ejecución aplicación (no web) como KeyValueConfigurationCollection:

KeyValueConfigurationCollection settings = 
    Configuration.ConfigurationManager.OpenExeConfiguration(Configuration.ConfigurationUserLevel.None).AppSettings.Settings; 
+0

Sé que esta es una pregunta antigua, pero la respuesta sugerida (la Actualización) en el OP no funciona en una aplicación _web_: ~ ( –

+0

@ Pure.Krome: Buen punto, gracias. He actualizado mi respuesta -inside-the-question. Desafortunadamente, no sé una solución para aplicaciones web. – Heinzi

+0

agregaré uno más tarde :) Lo tengo cubierto ... –

Respuesta

2

Ambos intentan resolver el mismo problema y son compatibles con el mismo esquema de configuración, pero la diferencia reside en el hecho de que ambos han evolucionado en tiempos de desarrollo diferentes, como usted dijo.

Pero no se trata de que esté utilizando versiones obsoletas. Esas son formas diferentes de obtener el mismo resultado. Tal vez no pueda entender por qué, pero a veces es necesario obtener su configuración de diferentes fuentes, así que tenga sentido tener estas opciones.

Respondiendo a su segunda pregunta, puede implementar un método de extensión para ambos tipos de devolución convirtiéndolos a un tipo común.

Por ejemplo, si desea NameValueCollection puede implementar lo siguiente:

public static NameValueCollection ToCollection(this KeyValueConfigurationCollection source) 
{ 
     // An iterator to create a NameValueCollection here and return it. 
} 

O si desea KeyValueConfigurationCollection, puede hacer lo mismo, pero para el retorno de los casos de este tipo.

Luego, cuando desee AppSettings, puede hacer ConfigurationManager.AppSettings.ToCollection(); y/o ConfigurationManager.OpenExeConfiguration(sExe).AppSettings.Settings.ToCollection();. Revisar la respuesta del autor edit! Esta parte de mi respuesta es incorrecta e inútil :) Gracias.

De hecho, las colecciones de nombre-valor están anticuadas por ser de .net 1.x días. Pero no es obsoleto, porque esta es la forma de hacerlo (por ahora).

+0

Gracias por la explicación. Acerca de la cuestión de la conversión: creo que he encontrado una solución más fácil para esto, consulte la actualización de mi pregunta. – Heinzi

+0

¡Uy! Eso es verdad, ¡perdón por este error! Tener esa solución que el método de extensión se vuelve inútil y una rueda de reinvención :) –

+0

Preferir la dependencia de System.Collections.Specialized.NameValueCollection sobre System.Configuration.KeyValueConfigurationCollection libera su componente de esperar valores con nombre en una sección de configuración. –

Cuestiones relacionadas