Episode ini mengajarkan konfigurasi aplikasi yang benar di .NET: options pattern dan binding ke POCO, file per environment, secrets management, provider JSON, env vars dan command line, serta strongly typed configuration dengan validasi.

Setiap aplikasi butuh pengaturan: koneksi database, API key, feature flag. Episode 10 membahas cara mengelola semua itu dengan benar di .NET — dari options pattern yang strongly typed, file per environment, hingga secrets management yang aman.
Masalah yang dipecahkan episode ini nyata: konfigurasi yang tersebar di kode sulit diubah tanpa rebuild, dan secret yang di-commit ke Git adalah bom waktu. Dengan sistem konfigurasi .NET, kalian memisahkan kode dari pengaturan dan membiarkan environment menentukan nilainya.
Daripada membaca key satu per satu, ikat sekelompok pengaturan ke sebuah POCO:
public class SmtpOptions
{
public string Host { get; set; }
public int Port { get; set; }
public bool UseTls { get; set; }
}Class SmtpOptions memetakan bagian konfigurasi Smtp. Property C# dipetakan otomatis dari key dengan casing yang sama — host, port, dan useTls.
Binding dilakukan di registrasi layanan:
builder.Services.AddOptions<SmtpOptions>()
.Bind(builder.Configuration.GetSection("Smtp"))
.ValidateDataAnnotations();builder.Configuration.GetSection("Smtp") mengambil bagian Smtp dari appsettings, lalu di-bind ke SmtpOptions. Dengan options pattern, layanan menerima IOptions<SmtpOptions> atau IOptionsMonitor<SmtpOptions> dan mendapatkan konfigurasi yang sudah bertipe.
Host memuat appsettings.json untuk semua environment, lalu appsettings.{Environment}.json untuk spesifik:
{
"Smtp": {
"Host": "localhost",
"Port": 1025,
"UseTls": false
}
}Saat ASPNETCORE_ENVIRONMENT=Development, nilai Smtp:Host diambil dari file Development. Host name diatur lewat variable ASPNETCORE_ENVIRONMENT (web) atau DOTNET_ENVIRONMENT (worker). File per environment ini ikut ke Git karena tidak berisi rahasia.
API key dan token tidak boleh berada di file JSON yang di-commit. Gunakan User Secrets saat development lokal:
dotnet user-secrets init
dotnet user-secrets set "Smtp:Host" "smtp.provider.com"dotnet user-secrets set "Smtp:Host" "smtp.provider.com" menyimpan nilai di luar project — dalam file profil pengguna yang tidak masuk Git. Untuk production, pakai environment variable atau secret manager cloud (episode 19).
Sistem konfigurasi .NET bersifat komposabel: banyak provider dibaca berurutan, dan provider belakangan menimpa yang awal. Urutan bawaan host:
appsettings.jsonappsettings.{Environment}.jsondotnet run -- --Smtp:Host smtp.lain.com--Smtp:Host smtp.lain.com menimpa nilai dari command line — berguna untuk pengujian cepat tanpa mengubah file.
Environment variable memakai __ sebagai pemisah bagian: Smtp__Host memetakan ke Smtp:Host. Contoh penerapan:
export Smtp__Host="smtp.provider.com"Karena env var adalah provider terakhir sebelum command line, nilai ini menang atas file JSON. Ini menjadi cara utama menginjeksi konfigurasi saat deployment ke container.
Konfigurasi yang salah sebaiknya gagal saat startup, bukan saat runtime:
public class SmtpOptions
{
[Required]
public string Host { get; set; }
[Range(1, 65535)]
public int Port { get; set; }
public bool UseTls { get; set; }
}Attribute [Required] dan [Range] memvalidasi nilai setelah binding. Jika validasi gagal, aplikasi melempar error saat startup — jauh lebih baik daripada memproses email dengan host kosong.
IOptionsMonitor<T> membaca nilai terbaru saat file konfigurasi berubah tanpa restart:
public class MailService
{
private readonly IOptionsMonitor<SmtpOptions> _opsi;
public MailService(IOptionsMonitor<SmtpOptions> opsi)
{
_opsi = opsi;
}
public string Host => _opsi.CurrentValue.Host;
}_opsi.CurrentValue.Host selalu memuat nilai terbaru. Gunakan IOptions<T> untuk nilai statis saat startup, dan IOptionsMonitor<T> untuk pengaturan yang perlu di-reload.
Warning
Jangan pernah menulis secret ke log atau response API. Validasi konfigurasi memastikan kesalahan ketahuan lebih awal, tetapi kewaspadaan menuliskan nilainya tetap menjadi tanggung jawab kalian.
Inti yang harus dibawa pulang:
appsettings.{Environment}.json memisahkan nilai per environment.Di episode 11 selanjutnya kita akan membahas web API dan HTTP client — dasar ASP.NET Core Web API, controllers, routing, model binding, dan response formatting, Minimal APIs, serta penggunaan HTTP client dengan pola resiliency.