IOptions ile Güçlü Türlendirilmiş Seçenekler
Yapılandırma bölümlerini IOptions , IOptionsSnapshot ve IOptionsMonitor kullanarak POCO sınıflarına bağlayın.
IOptions ile Güçlü Türlendirilmiş Seçenekler, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. 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.
Güçlü Türlendirilmiş Seçenekler Neden Kullanılır?
Yapılandırmayı IConfiguration["Key"] ile okumak, tür bilgisi olmayan dizeler verir. Options deseni, yapılandırma bölümlerini C# sınıflarıyla eşleyerek derleme zamanı güvenliği, IntelliSense ve doğrulama desteği sağlar.
Seçenekler Sınıfını Tanımlama
Özellik adları JSON anahtarlarıyla eşleşen düz bir POCO sınıfı oluşturun. Geleneksel olarak yapılandırma bölümünü tanımlamak için statik bir SectionName sabiti ekleyin.
// Configuration class
public class JwtOptions
{
public const string SectionName = "Jwt";
public string SecretKey { get; set; } = string.Empty;
public string Issuer { get; set; } = string.Empty;
public string Audience { get; set; } = string.Empty;
public int ExpiryMinutes { get; set; } = 60;
}
// appsettings.json:
{
"Jwt": {
"SecretKey": "my-very-secret-key",
"Issuer": "https://myapp.com",
"Audience": "https://myapp.com/api",
"ExpiryMinutes": 120
}
}Seçenekleri Kaydetme
Bir yapılandırma bölümünü seçenekler sınıfına bağlamak için Configure<T> çağrısı yapın. Bu işlem, IOptions<T>, IOptionsSnapshot<T> ve IOptionsMonitor<T> öğelerini DI'ye kaydeder.
// Registration
builder.Services.Configure<JwtOptions>(
builder.Configuration.GetSection(JwtOptions.SectionName));
// Alternative shorthand:
builder.Services
.AddOptions<JwtOptions>()
.BindConfiguration(JwtOptions.SectionName);
// Consuming via IOptions<T>:
public class TokenService
{
private readonly JwtOptions _opts;
public TokenService(IOptions<JwtOptions> opts)
=> _opts = opts.Value;
public string CreateToken()
=> $"Issuer={_opts.Issuer}, Exp={_opts.ExpiryMinutes}m";
}IOptions ile IOptionsSnapshot ve IOptionsMonitor Karşılaştırması
Farklı yaşam sürelerine ve yeniden yükleme davranışlarına sahip üç tür vardır. Kullanım senaryonuza uygun olanı seçin.
// IOptions<T> — Singleton, reads config ONCE at startup
public class ApiClient(IOptions<ApiOptions> opts)
{
private readonly ApiOptions _opts = opts.Value; // never changes
}
// IOptionsSnapshot<T> — Scoped, reloads per request
public class ReportService(IOptionsSnapshot<ReportOptions> opts)
{
private readonly ReportOptions _opts = opts.Value; // fresh per request
}
// IOptionsMonitor<T> — Singleton, live updates + change notifications
public class FeatureService(IOptionsMonitor<FeatureFlags> monitor)
{
public bool IsEnabled(string feature)
=> monitor.CurrentValue.EnabledFeatures.Contains(feature);
}Özniteliklerle Seçenek Doğrulama
Seçenek özelliklerine System.ComponentModel.DataAnnotations öznitelikleri ekleyin ve yapılandırma geçersizse uygulama başlatılırken hemen hata vermek için ValidateDataAnnotations() çağrısı yapın.
using System.ComponentModel.DataAnnotations;
public class SmtpOptions
{
[Required]
public string Host { get; set; } = string.Empty;
[Range(1, 65535)]
public int Port { get; set; } = 587;
[Required, EmailAddress]
public string FromAddress { get; set; } = string.Empty;
}
// Register with validation:
builder.Services
.AddOptions<SmtpOptions>()
.BindConfiguration("Smtp")
.ValidateDataAnnotations()
.ValidateOnStart(); // fail at startup, not first useIValidateOptions ile Özel Doğrulama
Karmaşık, özellikler arası kurallar için tam programatik doğrulama mantığı sağlamak üzere IValidateOptions<T> uygulayın.
public class JwtOptionsValidator : IValidateOptions<JwtOptions>
{
public ValidateOptionsResult Validate(string? name, JwtOptions opts)
{
var errors = new List<string>();
if (string.IsNullOrWhiteSpace(opts.SecretKey))
errors.Add("SecretKey must not be empty");
if (opts.SecretKey.Length < 32)
errors.Add("SecretKey must be at least 32 characters");
if (opts.ExpiryMinutes <= 0)
errors.Add("ExpiryMinutes must be positive");
return errors.Any()
? ValidateOptionsResult.Fail(errors)
: ValidateOptionsResult.Success;
}
}
builder.Services.AddSingleton<IValidateOptions<JwtOptions>, JwtOptionsValidator>();Post-Configure
PostConfigure, tüm Configure çağrılarından sonra çalışır ve değerleri geçersiz kılmanıza veya türetmenize olanak tanır; hesaplanan özellikler ya da ortama özgü ayarlamalar için kullanışlıdır.
builder.Services.Configure<CacheOptions>(
builder.Configuration.GetSection("Cache"));
// Override in test environment:
builder.Services.PostConfigure<CacheOptions>(opts =>
{
if (builder.Environment.IsEnvironment("Testing"))
{
opts.AbsoluteExpirationMinutes = 1; // very short in tests
opts.UseDistributedCache = false; // use in-memory cache
}
});
// PostConfigure always runs LAST, even after AddOptions validatorsAdlandırılmış Seçenekler
Aynı seçenek türünün birden çok örneğine ihtiyaç duyduğunuzda (örneğin iki SMTP sunucusu), bunları birbirinden ayırmak için adlandırılmış seçenekleri kullanın.
// Register named options:
builder.Services.Configure<SmtpOptions>("Primary",
builder.Configuration.GetSection("Smtp:Primary"));
builder.Services.Configure<SmtpOptions>("Backup",
builder.Configuration.GetSection("Smtp:Backup"));
// Consume with IOptionsMonitor (supports named options):
public class EmailSender
{
private readonly SmtpOptions _primary;
private readonly SmtpOptions _backup;
public EmailSender(IOptionsMonitor<SmtpOptions> monitor)
{
_primary = monitor.Get("Primary");
_backup = monitor.Get("Backup");
}
}BindConfiguration Kısa Yazımı
AddOptions().BindConfiguration() zinciri; kaydetme, bağlama, doğrulama ve hemen hata verme işlemlerini tek bir ifadede birleştiren modern ve akıcı yöntemdir.
// Full registration chain:
builder.Services
.AddOptions<DatabaseOptions>()
.BindConfiguration("Database") // bind section
.ValidateDataAnnotations() // attribute validation
.Validate(opts => // custom rule
opts.MaxPoolSize >= opts.MinPoolSize,
"MaxPoolSize must be >= MinPoolSize")
.ValidateOnStart(); // fail at startup
// Shorthand for simple cases:
builder.Services.AddOptions<AppOptions>()
.BindConfiguration(AppOptions.SectionName)
.ValidateOnStart();Gerçek Dünya: Özellik Bayrakları Seçenekleri
Yeniden yükleme desteğine sahip eksiksiz bir özellik bayrakları seçenekleri kurulumu; yeniden dağıtım yapmadan appsettings içindeki anahtarların değiştirilmesini sağlar.
public class FeatureFlags
{
public bool EnableNewCheckout { get; set; }
public bool EnableAISearch { get; set; }
public bool EnableBetaDashboard { get; set; }
}
// appsettings.json:
// { "FeatureFlags": { "EnableNewCheckout": true, ... } }
builder.Services
.AddOptions<FeatureFlags>()
.BindConfiguration("FeatureFlags")
.ValidateOnStart();
// In a controller or service:
public class CheckoutController : ControllerBase
{
private readonly FeatureFlags _flags;
public CheckoutController(IOptionsMonitor<FeatureFlags> m)
=> _flags = m.CurrentValue;
[HttpGet("/checkout")]
public IActionResult Index() =>
_flags.EnableNewCheckout
? Ok("new checkout")
: Ok("legacy checkout");
}Hızlı Kontrol
Canlı yapılandırma değişikliklerini yansıtması gereken bir tekil hizmette hangi IOptions türünü kullanmalısınız?
Özet: IOptions ile Güçlü Türlendirilmiş Seçenekler
Önemli çıkarımlar:
- Options deseni, yapılandırma bölümlerini
Configure<T>veyaAddOptions<T>().BindConfiguration()aracılığıyla POCO'lara bağlar IOptions<T>: Tekil, başlangıçta bir kez okurIOptionsSnapshot<T>: Kapsam ömürlüdür, istek başına yeniden yüklenir; tekil hizmetlere eklemeyinIOptionsMonitor<T>: Tekil kullanıma uygundur; canlıCurrentValue+OnChangesağlar- DataAnnotations +
ValidateDataAnnotations()+ValidateOnStart()ile doğrulayın - Aynı türün birden çok örneği için adlandırılmış seçenekleri kullanın
Sıkça Sorulan Sorular
“IOptions ile Güçlü Türlendirilmiş Seçenekler” dersi ücretsiz mi?
Evet — “IOptions ile Güçlü Türlendirilmiş Seçenekler” 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.
“IOptions ile Güçlü Türlendirilmiş Seçenekler” dersinde ne öğreneceğim?
Yapılandırma bölümlerini IOptions , IOptionsSnapshot ve IOptionsMonitor kullanarak POCO sınıflarına bağlayı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 2. dersidir.
“IOptions ile Güçlü Türlendirilmiş Seçenekler” 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