web-dev-qa-db-ja.com

App.config値を環境変数でオーバーライドします

App.config値を出力するC#コンソールプログラムがあります。環境変数からこの値をオーバーライドできますか?

私の実際のユースケースでは、値はバインドするポートを指定し、Jenkinsサーバーでプログラムの複数のインスタンスを実行する必要があるため、同じ構成ファイルを使用している場合でも、それぞれが異なる値を持つ必要があります。

App.configの例:

  <appSettings>
    <add key="TestKey" value="Foo"/>
  </appSettings>

サンプルコード:

  Console.WriteLine($"Key: {ConfigurationManager.AppSettings["TestKey"]}");

キー名を設定しようとしましたが、明らかに機能しません。

c:\Workspace\ConsoleApp2\ConsoleApp2\bin\Debug>set TestKey=Bar
c:\Workspace\ConsoleApp2\ConsoleApp2\bin\Debug>ConsoleApp2.exe
Key: Foo
6
sashoalm

ConfigurationManagerクラスはそれを行いません。アプリの構成からのみ、読み取りを行います。これを修正するには、ConfigurationManager.AppSettingsを直接呼び出す代わりに、関数を使用して変数を取得し、それを使用できます。これは、構成をJSONファイルまたはデータベースに簡単に移動でき、古いメソッドのすべての使用法を更新する必要がないことを意味するため、とにかく行うことをお勧めします。

例えば:

public string GetSetting(string key)
{
    var value = Environment.GetEnvironmentVariable(key);

    if(string.IsNullOrEmpty(value))
    {
        value = ConfigurationManager.AppSettings[key];
    }

    return value;
}
2
DavidG