Episode ini membahas pengaturan aplikasi .NET: appsettings.json dan environment variables, options pattern dengan binding ke POCO, secrets management serta konfigurasi multi-environment, dan peran IHostEnvironment dalam .NET Generic Host.

Aplikasi produksi hampir tidak pernah berjalan dengan nilai hardcode. String koneksi database berbeda antara development, staging, dan production — dan mengubahnya tidak boleh berarti meng-compile ulang kode. Di sinilah konfigurasi berperan.
Sistem konfigurasi .NET adalah model yang bertingkat: nilai bisa datang dari JSON, environment variables, atau command line, dan digabungkan dalam urutan tertentu. Nilai yang paling spesifik akan menang.
Episode 8 ini membahas appsettings.json, environment variables, options pattern, secrets management, dan Generic Host yang menjadi fondasi semua aplikasi ASP.NET Core modern.
File appsettings.json menyimpan konfigurasi default. Saat aplikasi berjalan, provider environment variables akan menimpa nilainya — pola yang sangat berguna di container:
{
"ConnectionStrings": {
"Default": "Host=localhost;Database=toko;Username=postgres;Password=secret"
},
"Email": {
"Sender": "no-reply@contoh.id",
"SmtpPort": 587
},
"AllowedHosts": "*"
}Konfigurasi di atas dibaca otomatis saat aplikasi dimulai. Untuk menimpa Email:SmtpPort dari environment variable, set Email__SmtpPort=465 — separator __ ganda di environment variable merepresentasikan tanda titik dua pada hierarki JSON.
Menangkap konfigurasi langsung ke POCO membuat kode kalian kuat terhadap typo di nama key. Inilah options pattern:
class EmailOptions
{
public string Sender { get; set; } = "";
public int SmtpPort { get; set; }
}
var builder = Host.CreateApplicationBuilder(args);
builder.Services.Configure<EmailOptions>(
builder.Configuration.GetSection("Email"));
var app = builder.Build();
app.Run();GetSection("Email") membaca subtree JSON Email dan memetakannya ke property class. Sekarang kalian bisa membaca konfigurasi dengan tipe yang aman, bukan string mentah.
Options diakses dengan menyuntikkan IOptions<T> ke dalam class:
class EmailSender
{
private readonly EmailOptions _options;
public EmailSender(IOptions<EmailOptions> options)
{
_options = options.Value;
}
public void Kirim()
{
Console.WriteLine($"Mengirim dari {_options.Sender} port {_options.SmtpPort}");
}
}Pola ini membuat pengaturan mudah diuji — kalian cukup mengganti IOptions<EmailOptions> dengan nilai yang berbeda saat testing.
.NET punya konsep environment bawaan: Development, Staging, dan Production. Aplikasi memuat appsettings.json lalu menimpa dengan appsettings.{Environment}.json. Untuk rahasia lokal, gunakan user-secrets yang disimpan di luar project:
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:Default" "Host=localhost;Database=toko;Username=postgres;Password=rahasia"Perintah dotnet user-secrets set menyimpan nilai di profil pengguna, bukan di repository. File secrets.json ini tidak pernah di-commit, sehingga password tidak bocor ke Git.
Environment dipilih lewat variable ASPNETCORE_ENVIRONMENT:
ASPNETCORE_ENVIRONMENT=Production dotnet runPerintah di atas memuat file appsettings.Production.json jika ada. Environment names bisa dicek di kode lewat IHostEnvironment.
Generic Host menyatukan konfigurasi, logging, dependency injection, dan siklus hidup aplikasi dalam satu pipeline. Saat membutuhkan nilai environment di dalam kode:
var builder = Host.CreateApplicationBuilder(args);
var environment = builder.Environment;
if (environment.IsDevelopment())
{
builder.Services.AddDeveloperExceptionPage();
}
Console.WriteLine($"Environment: {environment.EnvironmentName}");
Console.WriteLine($"Root path: {environment.ContentRootPath}");IHostEnvironment.EnvironmentName mengembalikan nama environment aktif, dan helper seperti IsDevelopment() membuat kode kondisional menjadi jelas. Ini juga memungkinkan kita menambahkan konfigurasi yang berbeda-beda untuk tiap environment.
Inti yang harus dibawa pulang:
ASPNETCORE_ENVIRONMENT memilih file konfigurasi per environment.Di episode 9 selanjutnya kita menyentuh database: data access dan persistence — Entity Framework Core dan DbContext, operasi CRUD, migrations dan relationships, querying dengan LINQ dan raw SQL, serta provider database seperti SQL Server, PostgreSQL, dan SQLite.