Belajar .NET - Configuration & Application Settings
Series/Belajar .NET/Episode 10
Episode 10 of 23

Belajar .NET - Configuration & Application Settings

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Options Pattern dan Binding ke POCO

POCO sebagai Kelas Konfigurasi

Daripada membaca key satu per satu, ikat sekelompok pengaturan ke sebuah POCO:

Kelas options
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 dan Registrasi

Binding dilakukan di registrasi layanan:

Bind options
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.

Multi-Environment Settings dan Secrets Management

File per Environment

Host memuat appsettings.json untuk semua environment, lalu appsettings.{Environment}.json untuk spesifik:

appsettings.Development.json
{
  "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.

Rahasia Jangan di Git

API key dan token tidak boleh berada di file JSON yang di-commit. Gunakan User Secrets saat development lokal:

Setup user secrets
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).

Configuration Providers

JSON, Environment Variables, dan Command Line

Sistem konfigurasi .NET bersifat komposabel: banyak provider dibaca berurutan, dan provider belakangan menimpa yang awal. Urutan bawaan host:

  • appsettings.json
  • appsettings.{Environment}.json
  • User Secrets (khusus Development)
  • Environment variables
  • Command line arguments
Menimpa lewat command line
dotnet run -- --Smtp:Host smtp.lain.com

--Smtp:Host smtp.lain.com menimpa nilai dari command line — berguna untuk pengujian cepat tanpa mengubah file.

Konvensi Environment Variable

Environment variable memakai __ sebagai pemisah bagian: Smtp__Host memetakan ke Smtp:Host. Contoh penerapan:

Set environment variable
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.

Strongly Typed Configuration dan Validation

Validasi dengan DataAnnotations

Konfigurasi yang salah sebaiknya gagal saat startup, bukan saat runtime:

Validasi options
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 untuk Nilai Dinamis

IOptionsMonitor<T> membaca nilai terbaru saat file konfigurasi berubah tanpa restart:

Membaca options
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.

Ringkasan Praktik Konfigurasi

  • Bind bagian konfigurasi ke POCO dengan AddOptions dan Bind.
  • Manfaatkan file per environment untuk perbedaan Development dan Production.
  • Simpan rahasia di User Secrets untuk lokal, env var untuk produksi.
  • Urutan provider: JSON, user secrets, env vars, command line.
  • Validasi dengan DataAnnotations agar kesalahan muncul saat startup.

Penutup

Inti yang harus dibawa pulang:

  • Options pattern mengikat konfigurasi ke POCO yang strongly typed.
  • File appsettings.{Environment}.json memisahkan nilai per environment.
  • User Secrets menyimpan rahasia lokal di luar project.
  • Environment variable memakai __ sebagai pemisah dan menimpa file JSON.
  • Command line adalah provider dengan prioritas tertinggi.
  • Validasi DataAnnotations memindahkan error konfigurasi ke waktu startup.

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.

Belajar .NET - Configuration & Application Settings | Belajar .NET