🙌

ini ファイルを汎用ホストや ASP.NET Core とかで使う方法

2025/01/09に公開

あまり需要はないとは思いますけどメモがてら。

ワーカーサービス (汎用ホスト) のプロジェクトを作って以下のパッケージを追加することで ini ファイルを読み込む機能を追加できます。

  • Microsoft.Extensions.Configuration.Ini

そして Program.cs で以下のようにして IConfiguration に ini ファイルを読み込むように設定します。

using WorkerService3;

var builder = Host.CreateApplicationBuilder(args);
// この行で ini ファイルを読み込むように設定
builder.Configuration.AddIniFile("settings.ini", optional: true);
builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

そしてプロジェクトのコンテンツとして settings.ini ファイルを追加して常にコピーをするようにしておきます。そして以下のように設定を書いておきます。

[test]
message=Hello world from ini file.

Worker.cs で以下のようにして ini ファイルの設定を読み込むことができます。

namespace WorkerService3;

public class Worker(
    ILogger<Worker> logger,
    IConfiguration configuration) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // test セクションの message を取得する
            logger.LogInformation("ini: {message}", configuration["test:message"]);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

これで Hello world from ini file. がログに出力されるようになります。

実際に使う場合は オプションパターン などを使って設定をオブジェクトにマッピングすることになると思いますが、もちろん ini ファイルでも可能です。

今回の場合は以下のように Message プロパティを持ったクラスを準備しておくことでマッピングできます。

public class TestSection
{
    public required string Message { get; set; }
}

Program.cs で以下のようにして設定をマッピングすることができます。

var builder = Host.CreateApplicationBuilder(args);
builder.Configuration.AddIniFile("settings.ini", optional: true);
// test セクションを TestSection クラスにバインドする
builder.Services.Configure<TestSection>(builder.Configuration.GetSection("test"));
builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

Worker.cs で以下のように IOptions<TestSection> を使って設定を取得することができます。

using Microsoft.Extensions.Options;

namespace WorkerService3;

public class Worker(
    ILogger<Worker> logger,
    IOptions<TestSection> testSection) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // test セクションの message を取得する
            logger.LogInformation("ini: {message}", testSection.Value.Message);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

まとめ

ini ファイルは、基本的に新規で使うことは無いと思いますが、過去の資産の流用などでどうしても必要なケースでは、読み取り専用の場合にはこのように IConfiguration に読み込むことが可能です。

Microsoft (有志)

Discussion