ASP.NET Core 6 でのスタートアップ時のConfigurationへのアクセス方法
問題
ASP.NET Core 6以降では、従来のStartup.cs
クラスが廃止され、代わりにProgram.cs
ファイルにすべての設定がまとめられるようになりました。これにより、IConfiguration
やIHostEnvironment
といったオブジェクトに従来とは異なる方法でアクセスする必要が生じました。
従来のASP.NET Core 5以前のコードでは、以下のようにStartupクラスのコンストラクターで依存性の注入によりこれらのオブジェクトを取得できました:
public class Startup
{
private readonly IHostEnvironment environment;
private readonly IConfiguration config;
public Startup(IConfiguration configuration, IHostEnvironment environment)
{
this.config = configuration;
this.environment = environment;
}
// その他のコード...
}
しかし、.NET 6の新しいテンプレートではこの方法が使えず、開発者が設定値の取得方法に戸惑うことがあります。
解決策
WebApplicationBuilderの使用
.NET 6以降では、WebApplication.CreateBuilder(args)
によって作成されるWebApplicationBuilder
オブジェクトを通じて設定と環境情報にアクセスします。
var builder = WebApplication.CreateBuilder(args);
// Configurationへのアクセス
ConfigurationManager configuration = builder.Configuration;
// 環境情報へのアクセス
IWebHostEnvironment environment = builder.Environment;
var builder = WebApplication.CreateBuilder(args);
// 接続文字列の取得例
builder.Services.AddDbContext<FestifyContext>(opt =>
opt.UseSqlServer(builder.Configuration.GetConnectionString("Festify")));
var app = builder.Build();
// その他の設定...
{
"ConnectionStrings": {
"Festify": "Server=myserver;Database=FestifyDB;Trusted_Connection=true;"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
アプリケーション構築後のアクセス
WebApplication
オブジェクトでも同様にConfigurationとEnvironmentにアクセスできます:
var app = builder.Build();
// アプリケーション構築後にアクセス
IConfiguration configuration = app.Configuration;
IWebHostEnvironment environment = app.Environment;
設定値のバインディング
設定値をクラスにバインドする場合:
// 設定クラスの定義
public class AppSettings
{
public LoggingSettings Logging { get; set; }
public class LoggingSettings
{
public string Default { get; set; }
}
}
// Program.csでのバインド
var appSettings = builder.Configuration.Get<AppSettings>();
string logLevel = appSettings.Logging.Default;
または、依存性注入を使用する場合:
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
ワーカーサービスの場合
INFO
ワーカーサービスではIHostBuilder
を使用するため、若干異なる方法で設定にアクセスします。
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
// IHostBuilderContextを通じて設定にアクセス
var settings = context.Configuration.Get<Settings>();
})
.Build();
ベストプラクティス
- 設定ファイルの階層化: 環境ごとに異なる設定ファイルを使用する
var builder = WebApplication.CreateBuilder(args);
// 必要に応じて追加の設定ファイルを読み込む
builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true);
- 環境変数の使用: 特に本番環境では環境変数を活用する
// 環境変数から直接取得する方法
var hostmail = Environment.GetEnvironmentVariable("hostmail") ?? "";
- 設定の検証: 必須の設定値が存在するか検証する
まとめ
ASP.NET Core 6以降では、WebApplicationBuilder
を通じて簡単に設定と環境情報にアクセスできます。従来のStartupクラスのパターンとは異なりますが、より簡潔で直感的なAPIを提供しています。プロジェクトの要件に応じて、適切な方法で設定値の管理を行いましょう。