Sumber & Penyedia Konfigurasi
Susun konfigurasi dari file JSON, variabel lingkungan, argumen baris perintah, dan penyedia kustom berdasarkan prioritas.
Sumber & Penyedia Konfigurasi adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Konfigurasi di .NET
Sistem konfigurasi ASP.NET Core membaca pengaturan dari berbagai sumber — berkas JSON, variabel lingkungan, argumen baris perintah, dan lainnya — lalu menggabungkannya menjadi satu penyimpanan pasangan kunci-nilai datar yang dapat diakses di mana pun dalam aplikasi Anda.
appsettings.json
appsettings.json adalah berkas konfigurasi bawaan. Berkas ini dimuat secara otomatis oleh Host.CreateApplicationBuilder. Pengaturan digabungkan dengan penggantian khusus lingkungan.
// appsettings.json
{
"App": {
"Name": "OrderService",
"MaxRetries": 3
},
"ConnectionStrings": {
"Default": "Server=localhost;Database=orders"
}
}
// appsettings.Production.json overrides the above:
{
"ConnectionStrings": {
"Default": "Server=prod-db;Database=orders;..."
}
}Membaca Nilai Konfigurasi
Akses konfigurasi melalui IConfiguration. Kunci menggunakan notasi titik dua untuk objek bertingkat. Array diakses berdasarkan indeks.
// Inject IConfiguration
public class OrderService
{
private readonly IConfiguration _config;
public OrderService(IConfiguration cfg) => _config = cfg;
public void Configure()
{
string? name = _config["App:Name"]; // "OrderService"
int maxRetries = _config.GetValue<int>("App:MaxRetries"); // 3
string? connStr = _config.GetConnectionString("Default");
// Nested section
var section = _config.GetSection("App");
string? appName = section["Name"];
}
}Variabel Lingkungan
Variabel lingkungan menimpa pengaturan JSON dan sangat penting untuk penerapan dalam kontainer. Garis bawah ganda (__) menggantikan pemisah titik dua pada kunci bertingkat.
# Set via shell or docker-compose:
export App__Name="OrderService-Prod"
export App__MaxRetries=5
export ConnectionStrings__Default="Server=prod-db;..."
// Equivalent to:
{
"App": { "Name": "OrderService-Prod", "MaxRetries": 5 },
"ConnectionStrings": { "Default": "Server=prod-db;..." }
}
// Priority: env vars > appsettings.{Environment}.json > appsettings.jsonArgumen Baris Perintah
Secara bawaan, argumen baris perintah memiliki prioritas tertinggi. Argumen ini menggunakan sintaks --key=value atau --key value, dengan titik dua atau garis bawah ganda untuk penyarangan.
# Override config when launching the app:
dotnet run --App:Name="CLI-Override" --App:MaxRetries=10
# Or:
dotnet run --App__Name="CLI-Override"
// The builder.Configuration.AddCommandLine() is called
// automatically by Host.CreateApplicationBuilder().
// Priority order (highest to lowest):
// 1. Command-line args
// 2. Environment variables
// 3. appsettings.{ASPNETCORE_ENVIRONMENT}.json
// 4. appsettings.jsonUser Secrets
User Secrets menyimpan konfigurasi sensitif di luar direktori proyek selama pengembangan. Data ini tidak pernah dikomit ke kendali sumber dan menimpa appsettings.json secara lokal.
# Initialize user secrets for the project:
dotnet user-secrets init
# Set a secret:
dotnet user-secrets set "Database:Password" "SuperSecret123"
dotnet user-secrets set "Jwt:SecretKey" "dev-only-key"
# List secrets:
dotnet user-secrets list
# Remove:
dotnet user-secrets remove "Database:Password"
# Stored in: ~/.microsoft/usersecrets/{projectId}/secrets.json
# Automatically loaded in Development environment onlyPenyedia Konfigurasi Kustom
Implementasikan IConfigurationProvider dan IConfigurationSource untuk memuat konfigurasi dari sumber apa pun — basis data, Consul, Vault, Redis, dan lainnya.
public class DbConfigProvider : ConfigurationProvider
{
private readonly string _connStr;
public DbConfigProvider(string connStr) => _connStr = connStr;
public override void Load()
{
using var conn = new NpgsqlConnection(_connStr);
conn.Open();
using var cmd = new NpgsqlCommand(
"SELECT key, value FROM app_config", conn);
using var reader = cmd.ExecuteReader();
while (reader.Read())
Data[reader.GetString(0)] = reader.GetString(1);
}
}
public class DbConfigSource : IConfigurationSource
{
private readonly string _connStr;
public DbConfigSource(string connStr) => _connStr = connStr;
public IConfigurationProvider Build(IConfigurationBuilder b)
=> new DbConfigProvider(_connStr);
}Mendaftarkan Penyedia Kustom
Tambahkan sumber konfigurasi kustom ke builder sebelum memanggil Build(). Sumber tersebut masuk ke rantai prioritas yang sama dengan penyedia bawaan.
var builder = Host.CreateApplicationBuilder(args);
// Add custom DB config provider after appsettings.json
builder.Configuration.Add(
new DbConfigSource(
builder.Configuration.GetConnectionString("Default")!));
// Or as an extension method:
public static class ConfigExtensions
{
public static IConfigurationBuilder AddDatabaseConfig(
this IConfigurationBuilder b, string connStr)
=> b.Add(new DbConfigSource(connStr));
}
// Usage:
builder.Configuration.AddDatabaseConfig(connStr);Azure App Configuration
Azure App Configuration memusatkan pengaturan di berbagai layanan mikro dengan flag fitur, label, dan pembuatan versi. Penyedia resminya terintegrasi sebagai sumber konfigurasi standar.
// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
builder.Configuration.AddAzureAppConfiguration(options =>
options
.Connect(builder.Configuration["AzureAppConfig:ConnectionString"])
.Select(KeyFilter.Any) // all keys
.Select(KeyFilter.Any, "Production") // label override
.UseFeatureFlags(ff =>
ff.CacheExpirationInterval = TimeSpan.FromMinutes(5))
.ConfigureRefresh(r =>
r.Register("App:Version", refreshAll: true)
.SetCacheExpiration(TimeSpan.FromMinutes(1)))
);
app.UseAzureAppConfiguration(); // enable dynamic refreshMemuat Ulang Konfigurasi
Beberapa penyedia mendukung deteksi perubahan. Penyedia JSON dapat memuat ulang konfigurasi saat berkas berubah. Gunakan IOptionsMonitor<T> untuk menanggapi perubahan saat program berjalan.
// Enable JSON file reload on change:
builder.Configuration.AddJsonFile("appsettings.json",
optional: false, reloadOnChange: true);
// In a service, use IOptionsMonitor (not IOptions) to get live values:
public class FeatureService
{
private readonly IOptionsMonitor<FeatureFlags> _monitor;
public FeatureService(IOptionsMonitor<FeatureFlags> m) => _monitor = m;
public bool IsBetaEnabled
=> _monitor.CurrentValue.BetaEnabled; // always fresh
// React to changes:
public FeatureService(IOptionsMonitor<FeatureFlags> m)
{
_monitor = m;
m.OnChange(flags => Console.WriteLine("Config changed!"));
}
}Pemeriksaan Singkat
Pemisah apa yang harus digunakan untuk merepresentasikan kunci konfigurasi JSON bertingkat sebagai variabel lingkungan?
Penerapan di Dunia Nyata: Konfigurasi dari Banyak Sumber
Penyiapan produksi yang menggabungkan appsettings, variabel lingkungan, dan User Secrets dengan urutan prioritas yang ditentukan secara eksplisit.
var builder = Host.CreateApplicationBuilder(args);
// Default: appsettings.json → appsettings.{env}.json → env vars → CLI
// Add user secrets in development:
if (builder.Environment.IsDevelopment())
builder.Configuration.AddUserSecrets<Program>();
// Optionally add Azure Key Vault in production:
if (!builder.Environment.IsDevelopment())
{
var keyVaultUri = builder.Configuration["Azure:KeyVaultUri"]!;
builder.Configuration.AddAzureKeyVault(
new Uri(keyVaultUri), new DefaultAzureCredential());
}
// Now all secrets are available transparently via IConfiguration
var jwtKey = builder.Configuration["Jwt:SecretKey"]!;Ringkasan: Sumber & Penyedia Konfigurasi
Poin penting:
- Konfigurasi digabungkan dari berbagai sumber; sumber yang datang kemudian menimpa sumber sebelumnya
- Prioritas: argumen CLI > variabel lingkungan > appsettings.{env}.json > appsettings.json
- Gunakan
__(garis bawah ganda) dalam variabel lingkungan untuk kunci bertingkat - User Secrets menjaga kredensial pengembangan tetap berada di luar kendali sumber
- Penyedia kustom: implementasikan
IConfigurationSource+IConfigurationProvider - Gunakan
reloadOnChange: true+IOptionsMonitoruntuk pembaruan konfigurasi langsung
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Sumber & Penyedia Konfigurasi” gratis?
Ya — teks lengkap “Sumber & Penyedia Konfigurasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Sumber & Penyedia Konfigurasi”?
Susun konfigurasi dari file JSON, variabel lingkungan, argumen baris perintah, dan penyedia kustom berdasarkan prioritas. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Sumber & Penyedia Konfigurasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Sumber & Penyedia Konfigurasi
- Options Bertipe Kuat dengan IOptions
- Validasi Options & Options Bernama
- Pengelolaan Rahasia