É uma boa prática armazenar informações de configurações de uma aplicação no arquivo web.config (no caso de aplicações ASP.NET) ou no app.config (para os outros tipos de aplicações). Isso possibilita a alteração desses parâmetros a qualquer momento, sem que haja necessidade de alteração e recompilação da aplicação. Entretanto, pode haver casos nos quais essas informações podem variar dependendo do contexto onde a aplicação é executada. Por exemplo, uma string de conexão ou algum outro parâmetro da aplicação pode (e provavelmente vai) ser diferente se a aplicação estiver sendo executada na máquina do desenvolvedor, em um servidor de testes, em um servidor de homologação ou em um servidor de produção. Entre as alternativas que temos para contornar essa situação, pode-se alterar manualmente o arquivo de configuração em cada um desses ambientes, ou então, criar uma versão do arquivo de configuração para cada caso. Não é difícil perceber que isso torna complexo o processo de gerenciamento desse arquivo, além de sucetível a erros e problemas. No caso de duplicação do arquivo de configuração, a situação é ainda pior, pois mesmos as configurações que são iguais para todos os casos acabam sendo duplicadas, e uma eventual mudança fará com que a mesma tenha que ser replicada para vários arquivos. Novamente, mais um ponto para introdução de erros e problemas.

Uma solução para minimizar esse problema é separar os parâmetros que são diferentes para cada caso em um arquivo de configuração apartado do arquivo de configuração da aplicação. Para isso, temos duas alternativas. A primeira delas é o atributo configSource dos elementos existentes dentro da seção <configuration> do arquivo de configuração. Esse atributo pode ser aplicado, por exemplo, nos elementos <connectionStrings>, <page>, <profile>, etc. No exemplo abaixo, a seção de configuração <connectionStrings> utiliza informações de configuração de um outro arquivo:

<connectionStrings configSource="arquivoExterno.config" />

 

E no arquivoExterno.config, temos:

<connectionStrings>
  <add name="minhaConexao" connectionString="string de conexao com o banco de dados" />
</connectionStrings>

 

Uma desvantagem do atributo configSource é que todas as configurações da seção onde ele é utilizado devem ser armazenadas no arquivo externo que ele referencia. Ou seja, não podemos combinar informações contidas no arquivo de configuração principal com informações de configuração de um arquivo externo para uma mesma seção de configuração.

Já o elemento appSettings dos arquivos de configuração .NET, que contém configurações específicas da aplicação, possui um atributo chamado file, que também permite especificar um arquivo externo cujo conteúdo será considerado quando sua aplicação requisitar alguma informação contida no arquivo de configuração. Ou seja, assim como no caso do atributo configSource, para a aplicação é totalmente transparente: a informação é recuperada como se a mesma estivesse no arquivo de configuração principal. Mas ao contrário do configSource, é possível combinar informações armazenadas no arquivo de configuração principal com informações de um arquivo de configurações separado.

O exemplo a seguir representa o que teríamos no elemento <appSettings> do arquivo web.config. Nesse caso, definimos algumas chaves no web.config e também indicamos que o arquivo meusDados.config deve ser utilizado para obter outras informações:

<appSettings file="meusDados.config"
  <add key="chave1" value="valor da chave 1"
  <add key="chave2" value="valor da chave 2">
</appSettings>

No arquivo meusDados.config, poderíamos ter algo do tipo:

<appSettings>
  <add key="chave3" value="valor da chave 3" />
  <add key="chave4" value="valor da chave 4" />
</appSettings>

 

Para a aplicação, ficariam disponíveis todos quatro valores, independentemente de onde os mesmos se ecnontram armazenados.

Referências
appSettings Element (General Settings Schema)