Belajar C# - Configuration & Environment Management
Series/Belajar C#/Episode 8
Episode 8 of 23

Belajar C# - Configuration & Environment Management

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.

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

Pendahuluan

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.

appsettings.json dan Environment Variables

Hierarki Konfigurasi

File appsettings.json menyimpan konfigurasi default. Saat aplikasi berjalan, provider environment variables akan menimpa nilainya — pola yang sangat berguna di container:

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

Options Pattern dan Binding ke POCO

Membuat Class Options

Menangkap konfigurasi langsung ke POCO membuat kode kalian kuat terhadap typo di nama key. Inilah options pattern:

Class options dan registrasi
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.

Mengakses Options di Layanan

Options diakses dengan menyuntikkan IOptions<T> ke dalam class:

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

Secrets Management dan Multi-environment

appsettings.Development.json dan user-secrets

.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:

Mengelola rahasia lokal
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.

Menentukan Environment Aktif

Environment dipilih lewat variable ASPNETCORE_ENVIRONMENT:

Menjalankan dengan environment tertentu
ASPNETCORE_ENVIRONMENT=Production dotnet run

Perintah di atas memuat file appsettings.Production.json jika ada. Environment names bisa dicek di kode lewat IHostEnvironment.

IHostEnvironment dan Generic Host

Menggunakan .NET Generic Host

Generic Host menyatukan konfigurasi, logging, dependency injection, dan siklus hidup aplikasi dalam satu pipeline. Saat membutuhkan nilai environment di dalam kode:

Membaca environment dari host
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.

Penutup

Inti yang harus dibawa pulang:

  • Konfigurasi digabungkan dari JSON, environment variables, dan command line.
  • Options pattern memetakan konfigurasi ke POCO yang aman tipe.
  • ASPNETCORE_ENVIRONMENT memilih file konfigurasi per environment.
  • user-secrets menjaga rahasia lokal keluar dari repository.
  • Generic Host menyatukan konfigurasi, DI, logging, dan siklus hidup.

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.