Yapılandırma Kaynakları ve Sağlayıcıları
Yapılandırmayı JSON dosyalarından, ortam değişkenlerinden, komut satırı bağımsız değişkenlerinden ve özel sağlayıcılardan öncelik sırasıyla katmanlayın.
Yapılandırma Kaynakları ve Sağlayıcıları, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
.NET'te Yapılandırma
ASP.NET Core'un yapılandırma sistemi, JSON dosyaları, ortam değişkenleri, komut satırı bağımsız değişkenleri ve daha birçok kaynaktan ayarları okur ve bunları uygulamanızın her yerinden erişilebilen tek bir düz anahtar-değer deposunda birleştirir.
appsettings.json
appsettings.json, varsayılan yapılandırma dosyasıdır. Host.CreateApplicationBuilder tarafından otomatik olarak yüklenir. Ayarlar, ortama özgü geçersiz kılmalarla birleştirilir.
// 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;..."
}
}Yapılandırma Değerlerini Okuma
Yapılandırmaya IConfiguration üzerinden erişin. İç içe nesneler için anahtarlarda iki nokta gösterimi kullanılır. Dizilere dizinleriyle erişilir.
// 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"];
}
}Ortam Değişkenleri
Ortam değişkenleri JSON ayarlarını geçersiz kılar ve kapsayıcılaştırılmış dağıtımlar için gereklidir. İç içe anahtarlardaki iki nokta ayraçlarının yerine çift alt çizgi (__) kullanılır.
# 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.jsonKomut Satırı Bağımsız Değişkenleri
Komut satırı bağımsız değişkenleri varsayılan olarak en yüksek önceliğe sahiptir. İç içe yapı için iki nokta veya çift alt çizgi kullanılarak --key=value ya da --key value söz dizimiyle yazılır.
# 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, geliştirme sırasında hassas yapılandırma bilgilerini proje dizininin dışında saklar. Bu bilgiler kaynak denetimine asla gönderilmez ve yerel olarak appsettings.json ayarlarını geçersiz kılar.
# 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 onlyÖzel Yapılandırma Sağlayıcıları
Yapılandırmayı veritabanı, Consul, Vault, Redis ve benzeri herhangi bir kaynaktan yüklemek için IConfigurationProvider ve IConfigurationSource uygulayın.
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);
}Özel Sağlayıcı Kaydetme
Build() çağrısından önce oluşturucuya özel bir yapılandırma kaynağı ekleyin. Bu kaynak, yerleşik sağlayıcılarla aynı öncelik zincirine dahil olur.
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, özellik bayrakları, etiketler ve sürüm oluşturma özellikleriyle mikro hizmetler arasındaki ayarları merkezileştirir. Resmî sağlayıcı, standart bir yapılandırma kaynağı olarak tümleştirilir.
// 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 refreshYapılandırmayı Yeniden Yükleme
Bazı sağlayıcılar değişiklik algılamayı destekler. JSON sağlayıcısı, dosya değiştiğinde yeniden yükleme yapabilir. Çalışma zamanındaki değişikliklere tepki vermek için IOptionsMonitor<T> kullanın.
// 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!"));
}
}Hızlı Kontrol
İç içe JSON yapılandırma anahtarlarını ortam değişkenleri olarak göstermek için hangi ayırıcıyı kullanmalısınız?
Gerçek Dünya: Birden Çok Kaynaktan Yapılandırma
appsettings, ortam değişkenleri ve User Secrets kaynaklarını açık bir öncelik sırasıyla birleştiren üretim kurulumu.
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"]!;Özet: Yapılandırma Kaynakları ve Sağlayıcıları
Önemli çıkarımlar:
- Yapılandırma birden çok kaynaktan birleştirilir; sonraki kaynaklar öncekileri geçersiz kılar
- Öncelik: CLI bağımsız değişkenleri > ortam değişkenleri > appsettings.{env}.json > appsettings.json
- İç içe anahtarlar için ortam değişkenlerinde
__(çift alt çizgi) kullanın - User Secrets, geliştirme kimlik bilgilerinin kaynak denetimine girmesini önler
- Özel sağlayıcılar:
IConfigurationSource+IConfigurationProvideruygulayın - Canlı yapılandırma güncellemeleri için
reloadOnChange: true+IOptionsMonitorkullanın
Sıkça Sorulan Sorular
“Yapılandırma Kaynakları ve Sağlayıcıları” dersi ücretsiz mi?
Evet — “Yapılandırma Kaynakları ve Sağlayıcıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Yapılandırma Kaynakları ve Sağlayıcıları” dersinde ne öğreneceğim?
Yapılandırmayı JSON dosyalarından, ortam değişkenlerinden, komut satırı bağımsız değişkenlerinden ve özel sağlayıcılardan öncelik sırasıyla katmanlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Yapılandırma Kaynakları ve Sağlayıcıları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yapılandırma Kaynakları ve Sağlayıcıları
- IOptions ile Güçlü Türlendirilmiş Seçenekler
- Seçenek Doğrulama ve Adlandırılmış Seçenekler
- Gizli Bilgilerin Yönetimi