É possível fazer algo como o seguinte nos arquivos app.config
ou web.config
?
<appSettings>
<add key="MyBaseDir" value="C:\MyBase" />
<add key="Dir1" value="[MyBaseDir]\Dir1"/>
<add key="Dir2" value="[MyBaseDir]\Dir2"/>
</appSettings>
Desejo acessar Dir2 em meu código simplesmente dizendo:
ConfigurationManager.AppSettings["Dir2"]
Isso me ajudará quando eu instalar meu aplicativo em diferentes servidores e locais onde terei que alterar apenas UMA entrada em toda a minha app.config
. (Sei que posso gerenciar toda a concatenação no código, mas prefiro assim).
c#
variables
web-config
app-config
DeeStackOverflow
fonte
fonte
Respostas:
Boa pergunta.
Acho que não. Acredito que seria bastante conhecido se houvesse uma maneira fácil, e vejo que a Microsoft está criando um mecanismo no Visual Studio 2010 para implantar diferentes arquivos de configuração para implantação e teste.
Com isso dito, no entanto; Eu descobri que você na
ConnectionStrings
seção tem um tipo de espaço reservado chamado "| DataDirectory |". Talvez você possa dar uma olhada no que está acontecendo lá ...Aqui está um pedaço de como
machine.config
mostrá-lo:fonte
Uma alternativa um pouco mais complicada, mas muito mais flexível, é criar uma classe que represente uma seção de configuração. Em seu arquivo
app.config
/web.config
, você pode ter isto:Então, em seu código .NET (usarei C # em meu exemplo), você pode criar duas classes como esta:
Finalmente, em seu código de programa, você pode acessar suas
app.config
variáveis, usando suas novas classes, desta maneira:fonte
Você pode realizar usando minha biblioteca Expansive . Também disponível no nuget aqui .
Ele foi projetado com isso como um caso de uso principal.
Exemplo moderado (usando AppSettings como fonte padrão para expansão de token)
Em app.config:
Use o método de extensão .Expand () na string a ser expandida:
ou
Use o wrapper Dynamic ConfigurationManager "Config" da seguinte forma (chamada explícita para Expand () não é necessária):
Exemplo avançado 1 (usando AppSettings como fonte padrão para expansão de token)
Em app.config:
Use o método de extensão .Expand () na string a ser expandida:
fonte
Eu pensei ter acabado de ver esta pergunta.
Resumindo, não, não há interpolação de variáveis dentro de uma configuração de aplicativo.
Você tem duas opções
fonte
Você tem algumas opções. Você poderia fazer isso com uma etapa de construção / implementação que processaria seu arquivo de configuração, substituindo suas variáveis pelo valor correto.
Outra opção seria definir sua própria seção de configuração que suportasse isso. Por exemplo, imagine este xml:
Agora você implementaria isso usando objetos de configuração personalizados que tratariam da substituição das variáveis para você no tempo de execução.
fonte
Normalmente, acabo escrevendo uma classe estática com propriedades para acessar cada uma das configurações do meu web.config.
Normalmente, também faço conversões de tipo quando necessário nesta aula. Ele permite ter um acesso digitado à sua configuração e, se as configurações forem alteradas, você poderá editá-las em apenas um lugar.
Normalmente, substituir as configurações por esta classe é relativamente fácil e fornece uma capacidade de manutenção muito maior.
fonte
Você pode usar variáveis de ambiente em seu
app.config
para esse cenário que você descreveEntão você pode facilmente obter o caminho com:
fonte
Dentro,
<appSettings>
você pode criar chaves de aplicativo,Mais tarde, você pode acessar esses valores usando:
fonte
Eu sugiro que você DslConfig . Com DslConfig, você pode usar arquivos de configuração hierárquicos de Global Config, Config por host de servidor para configurar por aplicativo em cada host de servidor (consulte o AppSpike).
Se isso for muito complicado para você, você pode apenas usar a configuração global Variables.var
Apenas configure em Varibales.var
E obter os valores de configuração com
fonte
Não acho que você possa declarar e usar variáveis para definir as chaves appSettings em um arquivo de configuração. Sempre administrei concatenações em código como você.
fonte
Estou lutando um pouco com o que você deseja, mas você pode adicionar um arquivo de substituição às configurações do aplicativo e ter esse arquivo de substituição definido para cada ambiente.
fonte
Para lançar produtos em que precisamos configurar muitos itens com valores semelhantes, usamos pequenos aplicativos de console que leem o XML e atualizam com base nos parâmetros passados. Eles são chamados pelo instalador depois de solicitar ao usuário o informação requerida.
fonte
Eu recomendaria seguir a solução de Matt Hamsmith. Se for um problema de implementação, por que não criar um método de extensão que implemente isso em segundo plano na classe AppSettings?
Algo como:
Dentro do método, você pesquisa em DictionaryInfoConfigSection usando Linq e retorna o valor com a chave correspondente. No entanto, você precisará atualizar o arquivo de configuração para algo assim:
fonte
Eu descobri esta solução:
Não estou muito feliz com esta solução porque tenho que alterar todos os atributos manualmente, se eu adicionar um novo, tenho que considerá-lo no app.xaml.cs.
Aqui está um snippet de código do App.xaml.cs:
ATUALIZAR
Acabei de encontrar uma melhoria (novamente um trecho de código do app.xaml.cs):
Agora as substituições funcionam para todos os atributos em minhas configurações que têm Type = string e Scope = User. Eu acho que gosto desse jeito.
ATUALIZAÇÃO2
Aparentemente, definir Scope = Application não é necessário ao executar as propriedades.
fonte
Três Soluções Possíveis
Para este exemplo, usei a seguinte configuração de aplicativo em um aplicativo de console:
1. Use variáveis de ambiente
Crie um evento de pré-construção que usará as variáveis MSBuild
SETX BaseDir "$(ProjectDir)"
Redefinir variáveis; usando algo como o seguinte:
Atualizar variáveis de ambiente no Stack Overflow
Use a configuração em seu código:
'
'
2. Use interpolação de string:
Use a função string.Format ()
`
`
3. Usando uma classe estática, esta é a solução que mais uso.
A implementação
`
`
A classe estática
`
`
Código do projeto:
App.config:
Program.cs
Evento de pré-construção:
Configurações do projeto -> Eventos de construção
fonte