Skip to content

ASP.NET Core 6 でのスタートアップ時のConfigurationへのアクセス方法

問題

ASP.NET Core 6以降では、従来のStartup.csクラスが廃止され、代わりにProgram.csファイルにすべての設定がまとめられるようになりました。これにより、IConfigurationIHostEnvironmentといったオブジェクトに従来とは異なる方法でアクセスする必要が生じました。

従来のASP.NET Core 5以前のコードでは、以下のようにStartupクラスのコンストラクターで依存性の注入によりこれらのオブジェクトを取得できました:

csharp
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オブジェクトを通じて設定と環境情報にアクセスします。

csharp
var builder = WebApplication.CreateBuilder(args);

// Configurationへのアクセス
ConfigurationManager configuration = builder.Configuration;

// 環境情報へのアクセス
IWebHostEnvironment environment = builder.Environment;
csharp
var builder = WebApplication.CreateBuilder(args);

// 接続文字列の取得例
builder.Services.AddDbContext<FestifyContext>(opt => 
    opt.UseSqlServer(builder.Configuration.GetConnectionString("Festify")));

var app = builder.Build();
// その他の設定...
json
{
  "ConnectionStrings": {
    "Festify": "Server=myserver;Database=FestifyDB;Trusted_Connection=true;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}

アプリケーション構築後のアクセス

WebApplicationオブジェクトでも同様にConfigurationとEnvironmentにアクセスできます:

csharp
var app = builder.Build();

// アプリケーション構築後にアクセス
IConfiguration configuration = app.Configuration;
IWebHostEnvironment environment = app.Environment;

設定値のバインディング

設定値をクラスにバインドする場合:

csharp
// 設定クラスの定義
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;

または、依存性注入を使用する場合:

csharp
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));

ワーカーサービスの場合

INFO

ワーカーサービスではIHostBuilderを使用するため、若干異なる方法で設定にアクセスします。

csharp
IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) =>
    {
        // IHostBuilderContextを通じて設定にアクセス
        var settings = context.Configuration.Get<Settings>();
    })
    .Build();

ベストプラクティス

  1. 設定ファイルの階層化: 環境ごとに異なる設定ファイルを使用する
csharp
var builder = WebApplication.CreateBuilder(args);

// 必要に応じて追加の設定ファイルを読み込む
builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true);
  1. 環境変数の使用: 特に本番環境では環境変数を活用する
csharp
// 環境変数から直接取得する方法
var hostmail = Environment.GetEnvironmentVariable("hostmail") ?? "";
  1. 設定の検証: 必須の設定値が存在するか検証する

まとめ

ASP.NET Core 6以降では、WebApplicationBuilderを通じて簡単に設定と環境情報にアクセスできます。従来のStartupクラスのパターンとは異なりますが、より簡潔で直感的なAPIを提供しています。プロジェクトの要件に応じて、適切な方法で設定値の管理を行いましょう。