0Pricing
C# Academy · レッスン

構成ソースとプロバイダー

JSONファイル、環境変数、コマンドライン引数、カスタムプロバイダーから構成を優先順位付きで重ね合わせます。

「構成ソースとプロバイダー」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

‍.NETの構成

ASP.NET Coreの構成システムは、JSONファイル、環境変数、コマンドライン引数など複数のソースから設定を読み込み、それらをアプリ内のどこからでもアクセスできる1つのフラットなキーと値のストアにマージします。

appsettings.json

appsettings.jsonは既定の構成ファイルです。Host.CreateApplicationBuilderによって自動的に読み込まれます。設定は環境固有の上書き設定とマージされます。

// appsettings.json
{
  "App": {
    "Name": "OrderService",
    "MaxRetries": 3
  },
  "ConnectionStrings": {
    "Default": "Server=localhost;Database=orders"
  }
}

// appsettings.Production.json overrides the above:
{
  "ConnectionStrings": {
    "Default": "Server=prod-db;Database=orders;..."
  }
}

構成値の読み取り

IConfigurationを使用して構成にアクセスします。キーでは、ネストしたオブジェクトを表すためにコロン記法を使用します。配列にはインデックスでアクセスします。

// Inject IConfiguration
public class OrderService
{
    private readonly IConfiguration _config;

    public OrderService(IConfiguration cfg) => _config = cfg;

    public void Configure()
    {
        string? name     = _config["App:Name"];           // "OrderService"
        int maxRetries   = _config.GetValue<int>("App:MaxRetries"); // 3
        string? connStr  = _config.GetConnectionString("Default");

        // Nested section
        var section = _config.GetSection("App");
        string? appName = section["Name"];
    }
}

環境変数

環境変数はJSONの設定を上書きするため、コンテナ化されたデプロイでは不可欠です。ネストしたキーでは、コロン区切り文字の代わりに二重アンダースコア(__)を使用します。

# Set via shell or docker-compose:
export App__Name="OrderService-Prod"
export App__MaxRetries=5
export ConnectionStrings__Default="Server=prod-db;..."

// Equivalent to:
{
  "App": { "Name": "OrderService-Prod", "MaxRetries": 5 },
  "ConnectionStrings": { "Default": "Server=prod-db;..." }
}

// Priority: env vars > appsettings.{Environment}.json > appsettings.json

コマンドライン引数

既定では、コマンドライン引数が最も高い優先順位を持ちます。構文には--key=valueまたは--key valueを使用し、ネストにはコロンまたは二重アンダースコアを使用します。

# Override config when launching the app:
dotnet run --App:Name="CLI-Override" --App:MaxRetries=10

# Or:
dotnet run --App__Name="CLI-Override"

// The builder.Configuration.AddCommandLine() is called
// automatically by Host.CreateApplicationBuilder().

// Priority order (highest to lowest):
// 1. Command-line args
// 2. Environment variables
// 3. appsettings.{ASPNETCORE_ENVIRONMENT}.json
// 4. appsettings.json

User Secrets

User Secretsは、開発中に機密性の高い構成をプロジェクトディレクトリの外部に保存します。ソース管理には決してコミットされず、ローカルではappsettings.jsonを上書きします。

# Initialize user secrets for the project:
dotnet user-secrets init

# Set a secret:
dotnet user-secrets set "Database:Password" "SuperSecret123"
dotnet user-secrets set "Jwt:SecretKey" "dev-only-key"

# List secrets:
dotnet user-secrets list

# Remove:
dotnet user-secrets remove "Database:Password"

# Stored in: ~/.microsoft/usersecrets/{projectId}/secrets.json
# Automatically loaded in Development environment only

カスタム構成プロバイダー

IConfigurationProviderとIConfigurationSourceを実装すると、データベース、Consul、Vault、Redisなど、任意のソースから構成を読み込めます。

public class DbConfigProvider : ConfigurationProvider
{
    private readonly string _connStr;
    public DbConfigProvider(string connStr) => _connStr = connStr;

    public override void Load()
    {
        using var conn = new NpgsqlConnection(_connStr);
        conn.Open();
        using var cmd = new NpgsqlCommand(
            "SELECT key, value FROM app_config", conn);
        using var reader = cmd.ExecuteReader();
        while (reader.Read())
            Data[reader.GetString(0)] = reader.GetString(1);
    }
}

public class DbConfigSource : IConfigurationSource
{
    private readonly string _connStr;
    public DbConfigSource(string connStr) => _connStr = connStr;
    public IConfigurationProvider Build(IConfigurationBuilder b)
        => new DbConfigProvider(_connStr);
}

カスタムプロバイダーの登録

Build()を呼び出す前に、ビルダーへカスタム構成ソースを追加します。組み込みプロバイダーと同じ優先順位チェーンに組み込まれます。

var builder = Host.CreateApplicationBuilder(args);

// Add custom DB config provider after appsettings.json
builder.Configuration.Add(
    new DbConfigSource(
        builder.Configuration.GetConnectionString("Default")!));

// Or as an extension method:
public static class ConfigExtensions
{
    public static IConfigurationBuilder AddDatabaseConfig(
        this IConfigurationBuilder b, string connStr)
        => b.Add(new DbConfigSource(connStr));
}

// Usage:
builder.Configuration.AddDatabaseConfig(connStr);

Azure App Configuration

Azure App Configurationは、機能フラグ、ラベル、バージョン管理を備え、マイクロサービス全体の設定を一元化します。公式プロバイダーは、標準的な構成ソースとして統合できます。

// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore

builder.Configuration.AddAzureAppConfiguration(options =>
    options
        .Connect(builder.Configuration["AzureAppConfig:ConnectionString"])
        .Select(KeyFilter.Any)                 // all keys
        .Select(KeyFilter.Any, "Production")   // label override
        .UseFeatureFlags(ff =>
            ff.CacheExpirationInterval = TimeSpan.FromMinutes(5))
        .ConfigureRefresh(r =>
            r.Register("App:Version", refreshAll: true)
             .SetCacheExpiration(TimeSpan.FromMinutes(1)))
);

app.UseAzureAppConfiguration(); // enable dynamic refresh

構成の再読み込み

一部のプロバイダーは変更検知をサポートしています。JSONプロバイダーは、ファイルが変更されたときに再読み込みできます。実行時の変更に反応するには、IOptionsMonitor<T>を使用します。

// Enable JSON file reload on change:
builder.Configuration.AddJsonFile("appsettings.json",
    optional: false, reloadOnChange: true);

// In a service, use IOptionsMonitor (not IOptions) to get live values:
public class FeatureService
{
    private readonly IOptionsMonitor<FeatureFlags> _monitor;

    public FeatureService(IOptionsMonitor<FeatureFlags> m) => _monitor = m;

    public bool IsBetaEnabled
        => _monitor.CurrentValue.BetaEnabled; // always fresh

    // React to changes:
    public FeatureService(IOptionsMonitor<FeatureFlags> m)
    {
        _monitor = m;
        m.OnChange(flags => Console.WriteLine("Config changed!"));
    }
}

クイックチェック

環境変数でネストしたJSON構成キーを表すには、どの区切り文字を使用すべきですか?

実例:複数ソースの構成

appsettings、環境変数、User Secretsを明示的な優先順位で組み合わせた本番環境の構成例です。

var builder = Host.CreateApplicationBuilder(args);

// Default: appsettings.json → appsettings.{env}.json → env vars → CLI
// Add user secrets in development:
if (builder.Environment.IsDevelopment())
    builder.Configuration.AddUserSecrets<Program>();

// Optionally add Azure Key Vault in production:
if (!builder.Environment.IsDevelopment())
{
    var keyVaultUri = builder.Configuration["Azure:KeyVaultUri"]!;
    builder.Configuration.AddAzureKeyVault(
        new Uri(keyVaultUri), new DefaultAzureCredential());
}

// Now all secrets are available transparently via IConfiguration
var jwtKey = builder.Configuration["Jwt:SecretKey"]!;

まとめ:構成ソースとプロバイダー

重要なポイント:

  • 構成は複数のソースからマージされ、後のソースが前のソースを上書きします
  • 優先順位:CLI引数 > 環境変数 > appsettings.{env}.json > appsettings.json
  • 環境変数でネストしたキーを指定するには__(二重アンダースコア)を使用します
  • User Secretsによって、開発用の認証情報をソース管理の対象外にできます
  • カスタムプロバイダーでは、IConfigurationSourceとIConfigurationProviderを実装します
  • ライブ構成更新には、reloadOnChange: trueとIOptionsMonitorを使用します

よくある質問

「構成ソースとプロバイダー」レッスンは無料ですか?

はい。「構成ソースとプロバイダー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「構成ソースとプロバイダー」で何を学びますか?

JSONファイル、環境変数、コマンドライン引数、カスタムプロバイダーから構成を優先順位付きで重ね合わせます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「構成ソースとプロバイダー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構成ソースとプロバイダー
  2. IOptionsによる強く型付けされたOptions
  3. Optionsの検証と名前付きOptions
  4. シークレット管理
← C# Academyに戻る