Muy buena solución.
Estuve siguiendo el hilo, y estos días de desocupado me puse a buscar cómo
lo habíamos solucionado a este problema en un proyecto de la empresa donde
trabajo.
La solución implementada es similar a la que plantea Fernando, salvo que
nosotros tenemos archivos de configuración versionados en una DB (una mezcla
de lo que se expuso antes).
Pero es una solución viable para Carlos esto que plante Fernando, es fácil
en código y no es necesario muchas horas.
Saludos cordiales,

---
Javier Ramos

MSN: [email protected]
Talk: [email protected]
SKYPE: edudebolivar

Móvil: 54 011 15 3064 6801
Mensajes: 54 011 5353 9494 Extensión: 2945173


2009/4/9 Fernando Tubio <[email protected]>

>  Carlos,
>
> El problema es el uso del atributo f*ile *en lugar de *configSource *para
> indicar el nombre del archivo donde se encuentra la configuración
> alternativa. Cuando se usa este atributo, los valores de configuración
> devueltos son el resultado de la fusión de la sección appSettings del
> archivo principal y el archivo secundario. Si existe el valor solicitado en
> el archivo especificado por el atributo *file*, se devuelve ese valor, en
> caso contrario, se devuelve el valor del archivo principal. Cuando se
> modifica alguno de los valores de la sección y luego se salva, estimo que no
> debe ser fácil determinar la intención del desarrollador y en cuál de los
> dos archivos se pretende guardar cada una de las configuraciones, así que
> debe ser por eso que guarda todos los valores en el archivo principal.
>
> Se pueden modificar los valores y salvarlos sin modificar el archivo
> principal si se utiliza el atributo *configSource*. Pero en ese caso
> *todos* los valores tienen que estar definidos en el archivo secundario.
>
> Si utilizar *configSource* no es viable, entonces te sugiero crear una
> sección alternativa para los valores "localizados".  Por ejemplo,
>
> *--- App.config ---*
> <configuration>
>   <configSections>
>     <section name="localizedAppSettings"
>              type="System.Configuration.AppSettingsSection"/>
>   </configSections>
>   <!-- VALORES NO LOCALIZADOS -->
>   <appSettings >
>     <add key="item0" value="CERO"/>
>     <add key="item2" value="DOS"/>
>   </appSettings>
>
>   <!-- VALORES LOCALIZADOS EN ARCHIVO SECUNDARIO -->
>   <localizedAppSettings configSource="App.EN.config" />
> </configuration>
>
>  *--- App.EN.config ---*
> <localizedAppSettings>
>   <add key="item1" value="ONE"/>
>   <add key="item2" value="TWO"/>
> </localizedAppSettings>
>
> Para reproducir el comportamiento de fusión entre ambos archivos, se puede
> crear un método helper que recupere el valor de la sección
> localizedAppSettings y si allí no existe, entonces devolver el valor que
> encuentra en appSettings. Por ejemplo, usando un extension method sería:
>
> public static class AppSettingsHelper
> {
>   public static KeyValueConfigurationElement
>        GetLocalizedSetting(this Configuration config, string key)
>   {
>     AppSettingsSection section =
>       (AppSettingsSection) config.GetSection("localizedAppSettings");
>
>     KeyValueConfigurationElement element = section.Settings[key];
>     if (element != null)
>       return element;
>
>      return config.AppSettings.Settings[key];
>   }
> }
>
> Y se podría usar de esta manera
>
> static void Main(string[] args)
> {
>   Configuration config =
>     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel
> .None);
>
>    // devuelve CERO - [X] app.config, [ ] app.EN.config
>   Console.WriteLine(config.GetLocalizedSetting("item0").Value);
>
>    // devuelve ONE - [ ] app.config, [X] app.EN.config
>   Console.WriteLine(config.GetLocalizedSetting("item1").Value);
>
>    // devuelve TWO - [X] app.config, [X] app.EN.config
>   Console.WriteLine(config.GetLocalizedSetting("item2").Value);
>
>   // si se salva, los cambios afectan solo appSettings
>   config.AppSettings.Settings["item2"].Value = "MODIFICADO";
>   config.Save(ConfigurationSaveMode.Modified);
> }
>
> Saludos,
>
> Fernando Tubio
>
>  ----- Original Message -----
> *From:* Carlos Marcelo Santos <[email protected]>
> *To:* [email protected]
>   *Sent:* Monday, April 06, 2009 12:09 PM
> *Subject:* [puntonet] app.config
>
>  Gracias por contestar José.
>
> Una aclaración, los valores de Terms.BR.config nunca los modifico desde la
> aplicación, sólo los del app.config. Así y todo me vuelca el
> Teerms.BR.config dentro del app.config
>
>
>
> Saludos.
>
>
>
> Carlos Marcelo Santos.
>
>
>
> *From:* [email protected] [mailto:[email protected]] *On Behalf Of *José
> A. Fernández
> *Sent:* Miércoles, 01 de Abril de 2009 08:29 a.m.
> *To:* [email protected]
> *Subject:* [puntonet] app.config
>
>
>
> Hola Carlos
>
>
>
> Utilizo esta tecnica de separar algunas secciones del web.config en
> archivos separados pero no los modifico desde la app, asi que no conocia de
> este comportamiento (que lo probare cuando tenga un tiempo, ya que debe ser
> algun parametro para la actualizacion del contenido en archivos separados)
>
>
>
> Lo que se me ocurre ahora es que debes abrir el archivo Terms.BR.config
> directamente y obtener la seccion appSettings y manipularla. No creo que la
> solucion sea como dice Daniel, porque si es un archivo separado del
> web.config en toda la aplicacion tendremos que hacer nuestra propia tecnica
> para leer los datos/obtener y en cambio si es <appSettings file=”
> Terms.BR.config”> de esta forma el ConfigurationManager lo tendremos siempre
> disponible sin necesidad de implementar nada (por esto me suena raro que
> para actualizar "copie" y debamos cambiar el modo de obtenerlo)
>
> Pero bueno la solucion "express" podria venir de la mano de algo asi:
>
>
>
> Dim webConfig As Configuration =
> WebConfigurationManager.OpenWebConfiguration("~/Terms.BR.config")
>
> Dim seccion As AppSettingsSection =
> CType(webConfig.GetSection("system.web/pages"), AppSettingsSection )
>
> ...y alli manipulas el contenido y lo guardas.
>
> ...te puede ayudar este articulo:
>
> - Acceder a propiedades/atributos de secciones del web.config mediante
> codebehind
>
>
> http://geeks.ms/blogs/fernandezja/archive/2008/07/29/acceder-a-propiedades-atributos-de-secciones-del-web-config-mediante-codebehind.aspx
>
>
>
>
>
> Espero que te sirva de ayuda o guia
> _______________________
> Jose A. Fernandez blog: http://geeks.ms/blogs/fernandezja
>
>
>
>
>
> 2009/3/31 Carlos Marcelo Santos <[email protected]>
>
> Muchas Gracias Diego y Daniel.
>
>
>
> Carlos Marcelo Santos.
>
>
>
> *From:* [email protected] [mailto:[email protected]] *On Behalf Of *Daniel
> Calvin
> *Sent:* Martes, 31 de Marzo de 2009 11:45 a.m.
>
>
> *To:* [email protected]
> *Subject:* [puntonet] app.config
>
>
>
> Net ya trae clases para eso y podes hace implementaciones propias.
> Podes guardar tu propio archivo de conf.
>
> Carlos fijate como se maneja en coop el lazyload.config, usa esas clases y
> algunas propias. Pero todo lo hace con las apis de conf de net.
>
> Daniel
>
> El 31 de marzo de 2009 11:31, Diego Jancic <[email protected]> escribió:
>
> Hola Carlos,
> Nunca lo hice, pero imagino que es asi por diseño o por error...
> No pensaste directamente hacer un workarround guardando las
> configuracion en un XML tuyo? Es muy facil hacer una clase con las
> propiedades que queres y serializarlo a XML...
>
> Saludos!
>
> 2009/3/31 Carlos Marcelo Santos <[email protected]>:
>
> > Hola Gente:
> >
> > Disculpen que insista con el tema del mail que copio debajo, ¿alguien
> sabe
> > que puede estar sucediendo?
> >
> >
> >
> > Muchas Gracias.
> >
> >
> >
> > Carlos Marcelo Santos.
> >
> >
> >
> > From: [email protected] [mailto:[email protected]] On Behalf Of
> Carlos
> > Marcelo Santos
> > Sent: Jueves, 26 de Marzo de 2009 12:29 p.m.
> > To: [email protected]
> > Subject: [puntonet] app.config
> >
> >
> >
> > Hola Lista:
> >
> > Tengo una aplicación desktop en la que uso el app.config para almacenar
> > valores de configuración entre los tags <appSettings></appSettings>
> >
> > Como necesito implementar multilanguaje extiendo el archivo app.config
> > usando el tag <appSettings> de la siguiente forma:
> >
> > <appSettings file=” Terms.BR.config”>
> >
> > Y cambiando el atributo de file, con un archivo XML bien definido cambio
> de
> > lenguaje sin problemas.
> >
> > Hasta acá todo anda bien.
> >
> > Mi problema se da cuando desde la ejecución del programa cambio algún
> > parámetro, al persistirlo en el app.config con:
> >
> >
> >
> > Dim mAppConfig As System.Configuration. Configuration =
> > ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
> >
> > mAppConfig.AppSettings.Item(“ItemConfig”).Value = “NuevoValor”
> >
> > mAppConfig.Save(ConfigurationSaveMode.Modified)
> >
> >
> >
> > Al ejecutar mAppConfig.Save me copia todo el contenido de
> “Terms.BR.config”
> > en el app.config
> >
> > ¿Conocen alguna forma de impedir que esta copia se produzca?
> >
> >
> >
> > Muchas Gracias.
> >
> >
> >
> > Carlos Marcelo Santos.
> >
> >
> >
> > Se certificó que el correo entrante no contiene virus.
> > Comprobada por AVG - www.avg.es
> > Versión: 8.5.278 / Base de datos de virus: 270.11.28/2022 - Fecha de la
> > versión: 03/25/09 18:54:00
>
>
>
>
> --
> Daniel A. Calvin
> Cooperator Team Member
> http://www.cooperator.com.ar
> Microsoft Certified Professional
>
> Se certificó que el correo entrante no contiene virus.
> Comprobada por AVG - www.avg.es
>
> Versión: 8.5.285 / Base de datos de virus: 270.11.32/2030 - Fecha de la
> versión: 03/31/09 06:02:00
>
>
>
> Se certificó que el correo entrante no contiene virus.
> Comprobada por AVG - www.avg.es
> Versión: 8.5.285 / Base de datos de virus: 270.11.32/2030 - Fecha de la
> versión: 04/01/09 06:06:00
>
>

Responder a