Una pregunta que siempre ronda nuestras labores de desarrolladores es como hago para cargar datos de un archivo config si este archivo esta asociado a un dll y yo estoy invocándolo desde una aplicación que carga su propio archivo config. Para ilustrarlo de mejor manera veamos el siguiente diagrama:
En este caso, una aplicación web invoca una librería que para poder acceder un recurso ( una base de datos, servicio WCF, etc ) requiere un dato que esta en un archivo de configuración. En estos casos lo que sucede es que la aplicación web carga su propio archivo config y cuando tratamos de obtener los valores que necesitamos se produce un error indicándonos que no encuentra los valores buscados.
La solución mas común es copiar esas parejas de valores dentro del config de la aplicación web para que estos puedan ser cargados; sin embargo, en muchos casos esta solución no es viable porque se utiliza un archivo distribuido para todas las aplicaciones, con lo cual es mas fácil el mantenimiento, pero un poquito mas complicada la programación.
La solución
Es posible cargar un archivo de configuración que pertenece a otro componente – el tema de si es adecuado o no lo dejamos para otro post - utilizando la clase ConfigurationManager y una instancia de la clase ExeConfigurationFileMap. El código para cargar un archivo de configuración es el siguiente:
1: public class AdministradorDeConfig
2: {
3: public string ObtenerValor(string pNombreVariable)
4: {
5: try
6: {
7: var _path = Assembly.GetExecutingAssembly().Location + ".config";
8:
9: var _configMap = new ExeConfigurationFileMap
10: {
11: ExeConfigFilename = _path
12: };
13:
14: var _configuracion = ConfigurationManager.OpenMappedExeConfiguration(_configMap, ConfigurationUserLevel.None);
15: var _settings = _configuracion.AppSettings;
16:
17: return _settings.Settings[pNombreVariable].Value;
18: }
19: catch (Exception _e)
20: {
21: Console.WriteLine(_e);
22: return string.Empty;
23: }
24: }
25: }
Como podemos ver, obtenemos el nombre del archivo de configuración utilizando Reflection – normalmente los archivos de configuración de las librerias se copian con el siguiente formato –> [Libreria.dll.config]. Luego procedemos a crear una instancia de la clase ExeConfigurationFileMap, la cual nos permite definir una estructura para mapear las configuraciones del archivo para poder cargarlo, en este caso simplemente le asignamos la ruta donde esta el archivo config y su nombre.
Luego procedemos a abrir el archivo de configuración con el método ConfigurationManager.OpenMappedExeConfiguration al cual le pasamos el FileMap y una variable que nos permite definir el nivel del usuario con el archivo por si desea llevar acciones tales como editar exclusivo, etc. Esta variable le asignamos None como configurationUserLevel y procedemos a trabajar con el archivo, que en este caso es solamente ir a traer la variable de la sección AppSettings que nos solicitan vía parámetro. Las variables disponibles se ven a continuación:
1: <?xml version="1.0" encoding="utf-8" ?>
2: <configuration>
3: <appSettings>
4: <add key="Valor1" value="Contenido del valor 1"/>
5: <add key="Valor2" value="Contenido del valor 2"/>
6: </appSettings>
7: </configuration>
En nuestro caso vamos a usar una prueba unitaria para acceder a las variables. El código de la prueba unitaria se ve a continuación:
1: [TestClass]
2: public class Pruebas_ConfigFiles
3: {
4: [TestMethod]
5: public void SolicitarVariable1_RetornaContenido1()
6: {
7: var _adminConfig = new AdministradorDeConfig();
8:
9: var _resultado = _adminConfig.ObtenerValor("Valor1");
10:
11: Assert.IsTrue( _resultado.Length > 0);
12: }
13: }
Como podemos ver, cuando ejecutamos la prueba unitaria el resultado es positivo:
No hay comentarios:
Publicar un comentario