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.json
の AppSettings
セクションを対応付けます。
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.json
と IOptions
パターンを活用すれば、設定値を安全かつ柔軟に扱えます。
Configuration
API で直接キーを指定して値を取得できるIOptions<T>
を使えば POCO にマッピングされ型安全になる- 複数セクションを分けて管理すれば、大規模プロジェクトでも見通しが良くなる
設定管理を適切に設計することは、メンテナンス性と可読性の高いアプリケーション開発に直結します。