🗒️
Microsoft.Extensions.Configuration.Jsonで読み込んだ設定値にPrefixを付与する
この投稿はC# Advent Calendar 2023 10日目の記事です。
Microsoft.Extensions、便利ですよね。
設定ファイルの読み込みにはMicrosoft.Extensions.Configuration
が利用できますが、今回はそれに関する小ネタです。
動機
設定ファイルを用途別に分けてほしい、といった要件が多々あります。
DBへの接続情報などを含んだファイル、メッセージ用のファイル、色に関するファイル、etc...
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をつける
こんなのと、
こんなのを準備して、
それらを用いて読み込みます。
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();
やったね!
-
「環境に応じた設定値を上書き読み込みできる」というM.E.Cの仕様によるものだと思います ↩︎
Discussion