概要
開発(Development)、検証(Staging)、本番(Production)といった環境ごとに異なる設定値を適用する実装です。 .NETの構成システムは、ベースとなる appsettings.json を読み込んだ後、環境変数 DOTNET_ENVIRONMENT に対応する appsettings.{Environment}.json を上書き読み込み(マージ)します。これにより、環境固有の値だけを差分管理できます。
仕様(入出力)
- 入力
appsettings.json(共通・デフォルト設定)appsettings.Development.json(開発環境用・上書き)appsettings.Production.json(本番環境用・上書き)- 環境変数
DOTNET_ENVIRONMENT
- 出力
- 現在の環境に合わせてマージされた構成値
- 動作
- キーが存在すれば上書きし、存在しなければベースファイルの値を維持します。
構成ファイル定義
プロジェクト直下に以下の3つのJSONファイルを作成し、「出力ディレクトリにコピー」設定を有効にします。
1. appsettings.json (ベース)
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"BaseUrl": "http://localhost/website/",
"Message": "appsettings.jsonの値です (Default)"
}
2. appsettings.Development.json (開発用)
Message キーのみを上書きします。
{
"Message": "appsettings.Development.jsonの値です (Dev Mode)"
}
3. appsettings.Production.json (本番用)
BaseUrl キーのみを上書きします。
{
"BaseUrl": "http://example.com/website/"
}
コード全文
現在の環境名と、マージされた設定値を確認するワーカースラスです。
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace EnvConfigSample
{
public class ConfigPrinterWorker : IConsoleWorker
{
private readonly IConfiguration _configuration;
private readonly IHostEnvironment _env;
private readonly ILogger<ConfigPrinterWorker> _logger;
// IConfiguration: 設定値へのアクセス
// IHostEnvironment: 現在の環境名(Development/Production等)の確認
public ConfigPrinterWorker(
IConfiguration configuration,
IHostEnvironment env,
ILogger<ConfigPrinterWorker> logger)
{
_configuration = configuration;
_env = env;
_logger = logger;
}
public Task RunAsync()
{
Console.WriteLine($"\n=== 現在の環境: {_env.EnvironmentName} ===");
// 1. BaseUrlの取得
// Development環境では上書きファイルにこのキーがないため、ベースの値が使われる
// Production環境では上書きファイルの値が使われる
string baseUrl = _configuration["BaseUrl"];
// 2. Messageの取得
// Development環境では上書きファイルの値が使われる
string message = _configuration["Message"];
Console.WriteLine($"[Config] BaseUrl : {baseUrl}");
Console.WriteLine($"[Config] Message : {message}");
Console.WriteLine("=====================================\n");
return Task.CompletedTask;
}
}
// (参考) インターフェース定義
public interface IConsoleWorker
{
Task RunAsync();
}
}
実行方法と結果
実行時の環境変数 DOTNET_ENVIRONMENT によって読み込まれるファイルが変化します。
ケース1: 開発環境 (Development)
Visual Studioのデフォルト、または以下のコマンドで実行した場合。
# PowerShellでの設定例
$env:DOTNET_ENVIRONMENT = "Development"
dotnet run
実行結果 BaseUrlはベースファイル、MessageはDevelopmentファイルの値になります。
=== 現在の環境: Development ===
[Config] BaseUrl : http://localhost/website/
[Config] Message : appsettings.Development.jsonの値です (Dev Mode)
=====================================
ケース2: 本番環境 (Production)
本番サーバーへのデプロイ時、または明示的にProductionを指定した場合。
# PowerShellでの設定例
$env:DOTNET_ENVIRONMENT = "Production"
dotnet run
実行結果 BaseUrlはProductionファイル、Messageはベースファイル(Production用JSONに定義がないため)の値になります。
=== 現在の環境: Production ===
[Config] BaseUrl : http://example.com/website/
[Config] Message : appsettings.jsonの値です (Default)
=====================================
まとめ
Microsoft.Extensions.Hosting のデフォルトビルダーを使用するだけで、appsettings.{Environment}.json の読み込みルールは自動的に適用されます。コード側で分岐処理(if (IsDevelopment) ...)を書く必要はなく、環境変数を切り替えるだけで設定値が透過的に差し替わるため、デプロイメントパイプラインでの管理が非常に容易になります。
