🗒️

Microsoft.Extensions.Configuration.Jsonで読み込んだ設定値にPrefixを付与する

2023/12/10に公開

この投稿はC# Advent Calendar 2023 10日目の記事です。

Microsoft.Extensions、便利ですよね。
設定ファイルの読み込みにはMicrosoft.Extensions.Configurationが利用できますが、今回はそれに関する小ネタです。

動機

設定ファイルを用途別に分けてほしい、といった要件が多々あります。
DBへの接続情報などを含んだファイル、メッセージ用のファイル、色に関するファイル、etc...

jsonはこんな感じ。
https://github.com/kk-river/Articles/blob/main/src/AdventCalender2023/configs.json
https://github.com/kk-river/Articles/blob/main/src/AdventCalender2023/messages.json

まとめて書いたら以下のような感じでしょうか

長いので折り畳み
{
  "configs": {
    "database": { 
      "host": "host.feature1.jp",
      "user": "user_for_feature1",
      "password": "password_for_feature1",
      "database": "database_for_feature1"
    }
  },
  "messages": {
    "database": {
        "commandTimeout": "Command failed with timeout.",
        "unknownHost": "Unknown host."
    }
  }
}

素直に読み込むには以下のように書けば良いです。

素直に読み込む
IConfiguration configuration = new ConfigurationBuilder()
    .AddJsonFile("messages.json", false, false)
    .AddJsonFile("configs.json", false, false)
    .Build();

読み込んだ値を表示してみると、以下のようになります。

どれがどれだかよく分かりませんね。

今回は発生していませんが、名前がバッティングするとエラーにならずそのまま値が消滅します。[1]
防止するためには単純に、キー全体でバッティングしていないかをチェックする必要があります。
私なら重複していても見落とします。ヨシ!

Prefixをつける

こんなのと、
https://github.com/kk-river/Articles/blob/main/src/AdventCalender2023/PrefixJsonConfigurationProvider.cs

こんなのを準備して、
https://github.com/kk-river/Articles/blob/main/src/AdventCalender2023/PrefixJsonConfigurationSource.cs

それらを用いて読み込みます。

prefixを付けて読み込む
IConfiguration configuration = new ConfigurationBuilder()
    .Add(new PrefixJsonConfigurationSource() { Path = "messages.json", Prefix = "messages", ReloadOnChange = true, })
    .Add(new PrefixJsonConfigurationSource() { Path = "configs.json", Prefix = "configs", ReloadOnChange = true, })
    .Build();

やったね!

脚注
  1. 「環境に応じた設定値を上書き読み込みできる」というM.E.Cの仕様によるものだと思います ↩︎

GitHubで編集を提案

Discussion