Skip to content

ASP.NET Core 6でのappsettings.jsonの使用方法

問題の概要

ASP.NET Core 6では、StartupクラスとProgramクラスが統合され、最小限のAPI構成が導入されました。これにより、従来の方法でappsettings.json設定ファイルにアクセスする方法が変更され、多くの開発者が新しい構成パターンに適応する必要が生じています。

元のコードでは、Redisキャッシュの接続文字列がハードコードされていました:

csharp
options.Configuration = "localhost:6379";

このような設定値はappsettings.jsonから読み込むべきで、環境ごとに異なる設定を柔軟に管理できます。

基本的な設定アクセス方法

方法1: 直接的な値の取得

builder.Configurationを使用して直接設定値にアクセスできます:

csharp
var builder = WebApplication.CreateBuilder(args);

// Redis設定の取得
var redisConfiguration = builder.Configuration["RedisCacheOptions:Configuration"];

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = redisConfiguration;
});

対応するappsettings.json

json
{
  "RedisCacheOptions": {
    "Configuration": "localhost:6379"
  }
}

方法2: セクションごとの取得

設定をセクション単位で取得する方法:

csharp
var redisSection = builder.Configuration.GetSection("RedisCacheOptions");
var redisConfiguration = redisSection["Configuration"];

型安全な設定バインディング

設定クラスの定義

設定値をクラスにマッピングすることで、型安全かつIntelliSenseのサポートを受けられます:

csharp
public class RedisCacheOptions
{
    public string Configuration { get; set; }
}

プログラムでの使用方法

csharp
var redisCacheOptions = new RedisCacheOptions();
builder.Configuration.GetSection("RedisCacheOptions").Bind(redisCacheOptions);

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = redisCacheOptions.Configuration;
});

依存性注入での使用

設定をサービスとして登録し、コントローラーなどで注入して使用できます:

csharp
// プログラムクラスでの設定
builder.Services.Configure<RedisCacheOptions>(
    builder.Configuration.GetSection("RedisCacheOptions"));

// コントローラーでの使用
public class MyController : ControllerBase
{
    private readonly RedisCacheOptions _redisOptions;
    
    public MyController(IOptions<RedisCacheOptions> options)
    {
        _redisOptions = options.Value;
    }
    
    // メソッド内で _redisOptions.Configuration を使用
}

複雑な設定構造の扱い

ネストされた設定構造も同様に扱えます:

json
{
  "AuthenticationConfiguration": {
    "JwtBearerConfiguration": {
      "Authority": "https://securetoken.google.com/somevalue",
      "TokenValidationConfiguration": {
        "Issuer": "https://securetoken.google.com/somevalue",
        "Audience": "somevalue"
      }
    }
  }
}

対応するクラス構造:

csharp
public class AuthenticationConfiguration
{
    public JwtBearerConfiguration JwtBearerConfiguration { get; set; } 
        = new JwtBearerConfiguration();
}

public class JwtBearerConfiguration
{
    public string Authority { get; set; }
    
    public TokenValidationConfiguration TokenValidationConfiguration { get; set; } 
        = new TokenValidationConfiguration();
}

public class TokenValidationConfiguration
{
    public string Issuer { get; set; }
    public string Audience { get; set; }
}

バインド方法:

csharp
var authConf = new AuthenticationConfiguration();
builder.Configuration.GetSection("AuthenticationConfiguration").Bind(authConf);

接続文字列の取得

データベース接続文字列など、一般的な接続文字列の取得:

csharp
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");

appsettings.jsonの設定:

json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=MyDb;Trusted_Connection=True;"
  }
}

環境別設定の活用

ASP.NET Coreでは、環境に応じた設定ファイルを自動的に読み込みます:

  • appsettings.json - 基本設定
  • appsettings.Development.json - 開発環境用
  • appsettings.Production.json - 本番環境用

環境変数は設定ファイルよりも優先され、機密情報の管理に適しています。

ベストプラクティス

機密情報(パスワード、APIキーなど)は設定ファイルではなく、環境変数またはSecret Managerを使用して管理することを推奨します。

まとめ

ASP.NET Core 6では、WebApplicationBuilderConfigurationプロパティを通じて簡単に設定値にアクセスできます。型安全なバインディングと依存性注入を組み合わせることで、保守性の高いコードを実現できます。

csharp
var builder = WebApplication.CreateBuilder(args);

// 設定の取得とサービス登録
var redisConfig = builder.Configuration.GetSection("Redis").Get<RedisSettings>();
builder.Services.AddSingleton(redisConfig);

// またはオプションパターンの使用
builder.Services.Configure<RedisSettings>(
    builder.Configuration.GetSection("Redis"));

これらの手法を活用することで、設定の管理が容易になり、アプリケーションの柔軟性と保守性が向上します。