【C#】設定ファイル(appsettings.json)を扱う方法|IOptionsパターン

C#/.NET アプリケーションでは、接続文字列や外部サービスのキーなどをソースコードに直書きせず、appsettings.json などの設定ファイルにまとめて管理するのが一般的です。さらに、IOptions パターンを使うことで、設定値を型安全に扱えるようになります。本記事では appsettings.json の基本構造と IOptions パターンを用いた実装方法を解説します。

appsettings.jsonの基本

プロジェクトのルートには通常 appsettings.json があり、設定を階層的に記述できます。

{
  "AppSettings": {
    "ApplicationName": "SampleApp",
    "Version": "1.0.0"
  },
  "Mail": {
    "Host": "smtp.example.com",
    "Port": 587
  }
}

設定値の読み取り(Configuration API)

Configuration API を直接使えば、キーを指定して値を取得できます。

using Microsoft.Extensions.Configuration;

class Program
{
    static void Main()
    {
        var config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        string appName = config["AppSettings:ApplicationName"];
        string version = config["AppSettings:Version"];

        Console.WriteLine($"{appName} - {version}");
    }
}

直接読み込む方法は簡単ですが、キー指定を文字列で行うため型安全性に欠けます。

IOptionsパターンの基本

IOptions<T> パターンを使うと、設定ファイルの内容を POCO(Plain Old CLR Object)にマッピングし、型安全に利用できます。

public class AppSettings
{
    public string ApplicationName { get; set; } = "";
    public string Version { get; set; } = "";
}

このクラスに appsettings.jsonAppSettings セクションを対応付けます。

DIコンテナに登録して利用

ASP.NET Core などでは Configure<T> を使って設定を登録できます。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

var builder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

var services = new ServiceCollection();
services.Configure<AppSettings>(builder.GetSection("AppSettings"));

var provider = services.BuildServiceProvider();
var options = provider.GetRequiredService<IOptions<AppSettings>>();

Console.WriteLine($"{options.Value.ApplicationName} - {options.Value.Version}");

options.Value とすることで設定値を型安全に取得できます。

複数セクションを扱う例

セクションごとにクラスを定義し、必要に応じて Configure<T> でバインドします。

public class MailSettings
{
    public string Host { get; set; } = "";
    public int Port { get; set; }
}

// 登録
services.Configure<MailSettings>(builder.GetSection("Mail"));

// 取得
var mail = provider.GetRequiredService<IOptions<MailSettings>>().Value;
Console.WriteLine($"{mail.Host}:{mail.Port}");

まとめ

appsettings.jsonIOptions パターンを活用すれば、設定値を安全かつ柔軟に扱えます。

  • Configuration API で直接キーを指定して値を取得できる
  • IOptions<T> を使えば POCO にマッピングされ型安全になる
  • 複数セクションを分けて管理すれば、大規模プロジェクトでも見通しが良くなる

設定管理を適切に設計することは、メンテナンス性と可読性の高いアプリケーション開発に直結します。