C# - アプリケーションで設定ファイルを使う

設定ファイルを用意することがある。
ASP.NET CoreのコンフィグはMicrosoft.Extensions.Configurationとして個別に使えるので、それを頼る。
なので、参照するドキュメントはこちら

サンプルコード

ConfigurationBuilderを構築して設定値を読み取る。

using System;
using Microsoft.Extensions.Configuration;

namespace MicrosoftExtensionsTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(AppContext.BaseDirectory)
                .AddJsonFile("appconfig.json")
                .Build();
            
            Console.WriteLine(config["root"]);
            Console.WriteLine(config["setting:A:value"]);
            Console.WriteLine(config["setting:A:B:value"]);
            Console.WriteLine(config["setting:A:B:C:value"]);
            Console.WriteLine(config["setting:A:B:C:D:value"]);
        }
    }
}

上のコードでは、実行ファイルと同じディレクトリに存在するappconfig.jsonという名前のファイルから設定値を読み出し、プログラム内で参照している。
appconfig.jsonの内容は以下の通り。

{
  "root" : "hello",
  "setting" : {
    "A" : {
      "B" : {
        "C" : {
          "D" : {
            "value" : "ddd"
          },
          "value" : "ccc"
        },
        "value" : "bbb"
      },
      "value" : "aaa"
    }
  }
}

簡単に解説

まず必要なパッケージをNugetするのだが、Microsoft.Extensions.Configuration.*全てが要るわけではなく、提供されている設定手段のうち使うものだけをインストールすればよい。
Microsoft.Extensions.Configurationが必須で、サンプルコードのようにファイルベースの設定をする場合はFileExtensionsが必要。さらに、Jsonを設定ファイルとして使うのであれJsonが要る。という感じ。
他には、コマンドラインから値を取得したり、設定値をBindできたり(データクラス通りに値が割り当てられインストタンス生成されるアレ)する。

ファイルで設定するとき、SetBasePath()でルートディレクトリを指定し、そこからの相対パスをAddxxxFile()していく。設定はいくらでも追加できるが、同じ設定値があった場合は後ろのほうが優先される(上書きされる)。
そして、読み出した値はディクショナリっぽく参照できる。
とても簡単に思える。

その他

AppContext.BaseDirectoryというのは、そのDLL/実行ファイルがあるディレクトリを指す(はず)。


See also