¿Es posible hacer algo como lo siguiente en los archivos app.config
o web.config
?
<appSettings>
<add key="MyBaseDir" value="C:\MyBase" />
<add key="Dir1" value="[MyBaseDir]\Dir1"/>
<add key="Dir2" value="[MyBaseDir]\Dir2"/>
</appSettings>
Luego quiero acceder a Dir2 en mi código simplemente diciendo:
ConfigurationManager.AppSettings["Dir2"]
Esto me ayudará cuando instale mi aplicación en diferentes servidores y ubicaciones donde solo tendré que cambiar UNA entrada en mi totalidad app.config
. (Sé que puedo administrar toda la concatenación en código, pero lo prefiero de esta manera).
c#
variables
web-config
app-config
DeeStackOverflow
fuente
fuente
Respuestas:
Buena pregunta.
No creo que lo haya. Creo que habría sido bastante conocido si hubiera una manera fácil, y veo que Microsoft está creando un mecanismo en Visual Studio 2010 para implementar diferentes archivos de configuración para implementación y prueba.
Dicho esto, sin embargo; He descubierto que en la
ConnectionStrings
sección tiene una especie de marcador de posición llamado "| DataDirectory |". Tal vez podrías echar un vistazo a lo que funciona allí ...Aquí hay un fragmento de
machine.config
mostrarlo:fuente
Una alternativa un poco más complicada, pero mucho más flexible, es crear una clase que represente una sección de configuración. En su archivo
app.config
/web.config
, puede tener esto:Luego, en su código .NET (usaré C # en mi ejemplo), puede crear dos clases como esta:
Finalmente, en el código de su programa, puede acceder a sus
app.config
variables, usando sus nuevas clases, de esta manera:fuente
Puedes lograrlo usando mi biblioteca Expansiva . También disponible en nuget aquí .
Fue diseñado con esto como un caso de uso principal.
Ejemplo moderado (usando AppSettings como fuente predeterminada para la expansión de tokens)
En app.config:
Utilice el método de extensión .Expand () en la cadena que se expandirá:
o
Utilice el contenedor Dynamic ConfigurationManager "Config" de la siguiente manera (la llamada explícita a Expand () no es necesaria):
Ejemplo avanzado 1 (usando AppSettings como fuente predeterminada para la expansión de tokens)
En app.config:
Utilice el método de extensión .Expand () en la cadena que se expandirá:
fuente
Pensé que acababa de ver esta pregunta.
En resumen, no, no hay interpolación de variables dentro de la configuración de una aplicación.
Tienes dos opciones
fuente
Tienes unas cuantas opciones. Puede hacer esto con un paso de compilación / implementación que procesaría su archivo de configuración reemplazando sus variables con el valor correcto.
Otra opción sería definir su propia sección de Configuración que lo admita. Por ejemplo, imagina este xml:
Ahora implementaría esto usando objetos de configuración personalizados que manejarían reemplazar las variables por usted en tiempo de ejecución.
fuente
Por lo general, termino escribiendo una clase estática con propiedades para acceder a cada una de las configuraciones de mi web.config.
Por lo general, también hago conversiones de tipos cuando es necesario en esta clase. Permite tener un acceso escrito a su configuración, y si la configuración cambia, puede editarla en un solo lugar.
Por lo general, reemplazar configuraciones con esta clase es relativamente fácil y proporciona una capacidad de mantenimiento mucho mayor.
fuente
Puede usar variables de entorno en su
app.config
para ese escenario que describeEntonces puede obtener fácilmente el camino con:
fuente
Dentro
<appSettings>
puede crear claves de aplicación,Más adelante puede acceder a estos valores usando:
fuente
Te sugiero DslConfig . Con DslConfig puede usar archivos de configuración jerárquica desde Configuración global, Configuración por host de servidor a configuración por aplicación en cada host de servidor (consulte AppSpike).
Si esto es
demasiado complicado para usted, puede usar la configuración global Variables.var Simplemente configure en Varibales.var
Y obtén los valores de configuración con
fuente
No creo que pueda declarar y usar variables para definir las claves de appSettings dentro de un archivo de configuración. Siempre he manejado concatenaciones en código como tú.
fuente
Estoy luchando un poco con lo que quieres, pero puedes agregar un archivo de anulación a la configuración de la aplicación y luego configurar ese archivo de anulación por entorno.
fuente
Para implementar productos en los que necesitamos configurar una gran cantidad de elementos con valores similares, utilizamos pequeñas aplicaciones de consola que leen el XML y se actualizan en función de los parámetros pasados. A continuación, el instalador las invoca después de haber pedido al usuario el información requerida.
fuente
Recomendaría seguir la solución de Matt Hamsmith. Si es un problema para implementar, ¿por qué no crear un método de extensión que implemente esto en segundo plano en la clase AppSettings?
Algo como:
Dentro del método, busca a través de DictionaryInfoConfigSection usando Linq y devuelve el valor con la clave correspondiente. Sin embargo, necesitará actualizar el archivo de configuración a algo como esto:
fuente
Se me ocurrió esta solución:
No estoy muy contento con esta solución porque tengo que cambiar todos los atributos manualmente, si agrego uno nuevo, tengo que considerarlo en app.xaml.cs.
Aquí un fragmento de código de App.xaml.cs:
ACTUALIZAR
Acabo de encontrar una mejora (de nuevo, un fragmento de código de app.xaml.cs):
Ahora los reemplazos funcionan para todos los atributos en mi configuración que tienen Type = string y Scope = User. Creo que me gusta así.
ACTUALIZAR2
Aparentemente, configurar Scope = Application no es necesario cuando se ejecuta sobre las propiedades.
fuente
Tres posibles soluciones
Para este ejemplo, he usado la siguiente configuración de aplicación en una aplicación de consola:
1. Utilice variables de entorno
Cree un evento previo a la compilación que utilizará las variables de MSBuild
SETX BaseDir "$(ProjectDir)"
Restablecer variables; usando algo como lo siguiente:
Actualizar variables de entorno en Stack Overflow
Use la configuración en su código:
'
'
2. Utilice la interpolación de cadenas:
Utilice la función string.Format ()
'
'
3. Usando una clase estática, esta es la solución que más utilizo.
La implementación
'
'
La clase estática
'
'
Código de proyecto:
App.config:
Program.cs
Evento previo a la construcción:
Configuración del proyecto -> Eventos de creación
fuente