2011-06-29 12 views
8

que tengo un archivo de configuración que se utiliza en varios proyectos, general.config, parecer:ajustes de configuración Override

<?xml version="1.0" encoding="utf-8" ?> 
<appSettings> 
    <add key="mykey1" value="myvalue1"/>  
    <add key="mykey2" value="myvalue2"/> 
</appSettings> 

En uno de los proyectos, que necesitan para anular una de las dos configuraciones. Por lo que el app.config de este proyecto se parece a:

<?xml version="1.0"?> 
<configuration> 
    <appSettings file="general.config"> 
    <remove key="mykey1"/> 
    <add key="mykey1" value="anothervalue"/> 
    <add key="mykey3" value="myvalue3"/> 
    </appSettings> 
</configuration> 

Pero remove no funciona aquí. ¿Cómo puedo anular mykey1 sin romper mykey2? add funciona en este caso. Puedo obtener myvalue3 desde ConfigurationManager.

EDIT: general.config se copia a la carpeta de salida automáticamente al compilar. No te preocupes por el problema de la ruta. Actualmente llegué:

ConfigurationManager.AppSettings["mykey1"] 
    //I got "myvalue1", but I want "anothervalue" here 
    //that is, this item is "overrided", just like virtual methods in C# 
ConfigurationManager.AppSettings["mykey2"] 
    //this setting will not be modified, currently it works fine 
ConfigurationManager.AppSettings["mykey3"] //good 
+0

¿se refiere a la transformación 'config'? –

+0

Espero que la ruta especificada mediante 'archivo' sea relativa a la configuración; de lo contrario, se ignoraría – V4Vendetta

+0

@ V4Vendetta: Estás en lo correcto. El general.config se copia a la carpeta de salida durante la compilación. –

Respuesta

2

Un amigo mío respondió esta pregunta. De MSDN:

Puede utilizar el atributo de archivo de especificar un archivo de configuración que proporciona ajustes adicionales o anula los ajustes que son especificado en el elemento appsettings. Puede utilizar el atributo de archivo en el control del desarrollo del equipo fuente escenarios, como por ejemplo cuando un usuario quiere para anular la configuración del proyecto que se especifican en un archivo de configuración de la aplicación . Los archivos de configuración que se especifican en un archivo deben tener el elemento appSettings en lugar del elemento de configuración como nodo raíz.

Así que en esta pregunta, los ajustes en general.config omite los artículos en app.config, diferentes de que pienso (quieren) app.config artículos anula artículos en general.config. Ahora creo que tengo que resolver este problema en el código C# (inevitablemente se verá feo).

+0

Sí ... como ya lo mencioné ... no es realmente como tú quieres – V4Vendetta

0

Los elementos se cambian por parte del niño y lo que quiero decir con esto es actualmente su app.config es el archivo principal y los valores se sustituyen por los existentes en General.config

Dado que está utilizando remove en el archivo principal lo que está haciendo efectivamente es eliminar el elemento que especifica en app.config pero después de eso los elementos de general.config se insertan. Ahora diga aquí en General.config que dice eliminar mykey3 que es en su app.config verá que la colección final no tiene clave como mykey3.

En resumen, esto no va a funcionar. Espero que esto te haya ayudado.

+0

No es cierto. 'general.config' no es un archivo de configuración completo, es una parte común (sección) de un archivo de configuración, compartido por todos mis archivos de configuración. –

0

Puede agregar otro archivo de configuración, digamos Test.config.

<appSettings> 
    <add key="mykey1" value="New value"/> 
</appSettings> 

y en la aplicación.sección appsettings de configuración se verá así

<appSettings file="Test.config"> 
    <add key="mykey1" value="myvalue1"/> 
</appSettings> 
+0

Pero en este caso perdí todos los demás elementos en 'general.config', como' mykey2'. –

+0

@Danny Chen: está funcionando correctamente. solo reemplaza el valor de la propiedad con la clave 'mykey1'. y todos los demás valores son los mismos que en el archivo app.config –

0

La utilización del atributo file para cargar la configuración común con la expectativa de que las llaves añaden directamente al elemento <appSettings> sería precedencia sobre los valores comunes es comprensible, pero por desgracia no la forma en que es trabajos.

La intención de Microsoft era que el atributo file cargue configuraciones comunes que anulan la configuración de la aplicación individual.

Esto se discute en detalle en el Microsoft Documentation

Para superar este problema, muy de vez en cuando declaramos la configuración de base común en el archivo, y luego el apropiado nombre de anulaciones en la configuración de la aplicación. Sin embargo, esto requiere un código adicional que es un poco feo. p.ej.

var config = ConfigurationManager.AppSettings["MSG_QUEUE_PROVIDER_OVERRIDE"] 
    ?? ConfigurationManager.AppSettings["MSG_QUEUE_PROVIDER"] 
    ?? "ActiveMQ"; 

<appSettings file="common.config"> 
    <!-- Override the common values --> 
    <add key="MSG_QUEUE_PROVIDER_OVERRIDE" value="RabbitMQ"/> 
</appSettings>