.NET Core(コンソールアプリ)で、設定ファイルとのやりとりをする(dotnet core 2.2)


ConfigurationBuilder だけだと、読み込みしか出来ない?

ConfigurationBuilder()を利用して設定を読み込む処理の情報はたくさん見つかるけれど、書き込みをする情報が見つからない。AddJsonFileメソッドの optional: true にすると、もしかして書き込めるのかとも思ったけども、バインディング使うと反映されていないので、ちょっと現在の考え方では使えなさそう。

ConfigurationManagerは、dotnet core では使えないという記事が多いけど、Macで書いてると普通に使えるから、dotnet core(standard) の最新版だと、使えるようにAPI追加されたのだろうと思い、これらを駆使して実装することにしてみたので、記録として残しとく。


ConfigurationBuilder は読み込み用に。

こちら、パッケージに含まれていない場合があるので、NuGetで手に入れとく。

まだ全容把握してないので、漏れがあるかも...

JSONファイル形式で操作するので、Jsonもいれる。

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.Json

依存関係があるパッケージは勝手に入るから、それを放り込んでおけばいい。

読み込みしたい場所に、ConfigurationBuilderでの処理を書く

using System.IO;

using Microsoft.Extensions.Configuration;

var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true);

var build = config.Build();

// バインディングしたい場合は、そのクラスを作りオブジェクト化してバインディングする
var appSettings = new AppSettings();
build.Bind(appSettings);

Microsoft.Extension.Configuration.Json などのパッケージを入れていないと、new ConfigurationBuilder() のあとに . 入れても、SetBasePath() メソッドなどがインテリセンスで見つからないので注意が必要。最近の開発環境だと、コンソールやらASP.NETのプロジェクトを作ると、Microsoft.Extensions.Configurationのパッケージだけは入っているのかもしれない。なので、最初は迷った。


書き込み用に ConfigurationManager を使う

読み込みもこちらでしたらいいのでは?と思ったけど、うまくsection 分けが dotnet core ではできなかった(.NET Frameworkと差があるのだろうか)のと、開発用とデプロイ用で設定を分けようとすると上のがやりやすいのと、こちらの方法、保存をするとコメントを吹っ飛ばしてくれるので、分けることにした(sectionが分けられなかったのでしかたなくというか)

using System.Configuration;

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var ret = config.AppSettings.Settings["hogehoge"].Value;
config.AppSettings.Settings["hogehoge"].Value = "3";
config.Save();

文字列で保存されちゃうので、数値の取り扱いなどだとパースする必要があり面倒だけど、致し方あるまい。


まとめ

ASP.NET Core でも当然だけど一応使える。とはいえ、WebだとDB使ったりするし、普通に多目的用とだからあまりConfigurationManagerのお世話になることは無いと思うけど。あとは、.NET Core 3.0 からWPFやらUWPやらWindows Forms も採用されるので、ウィンドウの場所とか保存するために設定ファイルに保存する用途なりはあると思うけど、保存処理の実装はあるのかな。バインディングしてるからだめなのかもしれないけど...。