Seçenek Doğrulama ve Adlandırılmış Seçenekler
Seçenekleri başlangıçta DataAnnotations veya FluentValidation ile doğrulayın, birden çok örnek için adlandırılmış seçenekleri kullanın.
Seçenek Doğrulama ve Adlandırılmış Seçenekler, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. 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.
Seçenekler Neden Doğrulanır?
Eksik veya hatalı yapılandırma, izlenmesi zor çalışma zamanı hatalarına neden olur. Seçeneklerin başlangıçta doğrulanması, sessiz yapılandırma hatalarını herhangi bir istek karşılanmadan önce açık ve açıklayıcı özel durumlara dönüştürür.
ValidateOnStart
ValidateOnStart(), doğrulamayı ilk kullanımda tembelce yapmak yerine uygulama başlatılır başlatılmaz tetikler. Böylece yanlış yapılandırılmış bir dağıtım saatler sonra değil, anında başarısız olur.
builder.Services
.AddOptions<DatabaseOptions>()
.BindConfiguration("Database")
.ValidateDataAnnotations()
.ValidateOnStart(); // throw OptionsValidationException on startup
// Without ValidateOnStart:
// - Validation only runs on first IOptions<T>.Value access
// - A rarely-used service could run for hours before failing
// With ValidateOnStart:
// - App fails at Host.Run() if config is invalid
// - Health checks and probes never report healthy for bad configDataAnnotations Doğrulaması
Seçenekler sınıfınızda standart System.ComponentModel.DataAnnotations özniteliklerini kullanın. Bu öznitelikler ValidateDataAnnotations() tarafından otomatik olarak değerlendirilir.
using System.ComponentModel.DataAnnotations;
public class EmailOptions
{
[Required(ErrorMessage = "SMTP host is required")]
[MinLength(3)]
public string SmtpHost { get; set; } = string.Empty;
[Range(1, 65535, ErrorMessage = "Port must be 1-65535")]
public int SmtpPort { get; set; } = 587;
[Required]
[EmailAddress(ErrorMessage = "Invalid sender address")]
public string SenderAddress { get; set; } = string.Empty;
[Range(1, 30)]
public int TimeoutSeconds { get; set; } = 10;
}
builder.Services
.AddOptions<EmailOptions>()
.BindConfiguration("Email")
.ValidateDataAnnotations()
.ValidateOnStart();Özel Doğrulama Temsilcisi
Validate(Func<T, bool>, string) aşırı yüklemesi, özellikler arası kısıtlamalar gibi özniteliklerle ifade edilemeyen kurallar için bir lambda ekler.
builder.Services
.AddOptions<ConnectionPoolOptions>()
.BindConfiguration("ConnectionPool")
.ValidateDataAnnotations()
.Validate(
opts => opts.MaxSize >= opts.MinSize,
"MaxSize must be greater than or equal to MinSize")
.Validate(
opts => opts.ConnectionTimeoutMs > 0,
"ConnectionTimeoutMs must be positive")
.ValidateOnStart();
public class ConnectionPoolOptions
{
[Range(1, 100)] public int MinSize { get; set; } = 2;
[Range(1, 500)] public int MaxSize { get; set; } = 20;
public int ConnectionTimeoutMs { get; set; } = 5000;
}Karmaşık Kurallar için IValidateOptions
Birden çok hata iletisi içeren karmaşık mantık için IValidateOptions<T> uygulayın. Bu öğe, seçenek örneğini alır ve ayrıntılı başarısızlık iletileri içeren bir sonuç döndürür.
public class PaymentOptionsValidator : IValidateOptions<PaymentOptions>
{
public ValidateOptionsResult Validate(string? name, PaymentOptions opts)
{
var failures = new List<string>();
if (opts.Provider == "Stripe" && string.IsNullOrWhiteSpace(opts.StripeSecretKey))
failures.Add("StripeSecretKey is required when Provider is Stripe");
if (opts.Provider == "PayPal" && string.IsNullOrWhiteSpace(opts.PayPalClientId))
failures.Add("PayPalClientId is required when Provider is PayPal");
if (opts.RetryCount < 0 || opts.RetryCount > 5)
failures.Add("RetryCount must be between 0 and 5");
return failures.Count == 0
? ValidateOptionsResult.Success
: ValidateOptionsResult.Fail(failures);
}
}
builder.Services.AddSingleton<IValidateOptions<PaymentOptions>, PaymentOptionsValidator>();Adlandırılmış Seçenekler — Kavram
Adlandırılmış seçenekler, aynı seçenek türünün birden çok yapılandırmasını kaydetmenizi sağlar. Yaygın bir kullanım senaryosu, her biri farklı temel URL'lere ve zaman aşımı sürelerine sahip birden çok dışa giden HTTP istemcisidir.
// appsettings.json:
{
"HttpClients": {
"Orders": {
"BaseUrl": "https://orders-service",
"TimeoutSeconds": 30
},
"Inventory": {
"BaseUrl": "https://inventory-service",
"TimeoutSeconds": 10
}
}
}
public class HttpClientOptions
{
public string BaseUrl { get; set; } = string.Empty;
public int TimeoutSeconds { get; set; } = 30;
}Adlandırılmış Seçenekleri Kaydetme
Configure<T> için ilk bağımsız değişken olarak bir ad dizesi geçirin. Belirli bir örneği çözümlemek için IOptionsMonitor<T>.Get(name) kullanın.
// Register:
builder.Services.Configure<HttpClientOptions>("Orders",
builder.Configuration.GetSection("HttpClients:Orders"));
builder.Services.Configure<HttpClientOptions>("Inventory",
builder.Configuration.GetSection("HttpClients:Inventory"));
// Consume:
public class ApiGateway
{
private readonly HttpClientOptions _orders;
private readonly HttpClientOptions _inventory;
public ApiGateway(IOptionsMonitor<HttpClientOptions> monitor)
{
_orders = monitor.Get("Orders");
_inventory = monitor.Get("Inventory");
}
// IOptions<T>.Value always returns the unnamed (default) instance
// IOptionsMonitor<T>.Get(name) returns the named instance
}Adlandırılmış Seçenekleri Doğrulama
Her adlandırılmış kayıt için AddOptions<T>(name) çağrısı yaparak adlandırılmış seçenekleri ayrı ayrı doğrulayın.
foreach (var clientName in new[] { "Orders", "Inventory", "Auth" })
{
builder.Services
.AddOptions<HttpClientOptions>(clientName)
.BindConfiguration($"HttpClients:{clientName}")
.ValidateDataAnnotations()
.Validate(
opts => Uri.IsWellFormedUriString(opts.BaseUrl, UriKind.Absolute),
$"HttpClients:{clientName}:BaseUrl must be a valid absolute URI")
.ValidateOnStart();
}
// If any named instance fails, the app refuses to startOptionsBuilder API'si
OptionsBuilder<T> (AddOptions<T>() tarafından döndürülür), tüm kaydetme, bağlama ve doğrulama adımlarını temiz biçimde zincirleyen akıcı programlama arayüzüdür.
// Full OptionsBuilder chain:
builder.Services
.AddOptions<DatabaseOptions>() // create builder
.BindConfiguration("Database") // bind JSON section
.Configure(opts => // manual override
{
if (builder.Environment.IsDevelopment())
opts.EnableDetailedErrors = true;
})
.PostConfigure(opts => // runs after all Configure
{
opts.ConnectionString ??= "default-fallback";
})
.ValidateDataAnnotations() // attribute rules
.Validate(o => o.MaxPoolSize > 0,
"MaxPoolSize must be positive")
.ValidateOnStart(); // eager validationGerçek Dünya: Yeniden Deneme İlkesi Seçenekleri
Alanlar arası doğrulama ve farklı hizmetler için adlandırılmış ilkeler içeren eksiksiz bir yeniden deneme seçenekleri kurulumu.
public class RetryOptions
{
[Range(0, 10)] public int MaxAttempts { get; set; } = 3;
[Range(100, 60000)] public int BaseDelayMs { get; set; } = 500;
public bool UseExponentialBackoff { get; set; } = true;
[Range(1, 120000)] public int MaxDelayMs { get; set; } = 30000;
}
foreach (var policy in new[] { "Database", "HttpClient", "MessageBus" })
{
builder.Services
.AddOptions<RetryOptions>(policy)
.BindConfiguration($"RetryPolicies:{policy}")
.Validate(o => !o.UseExponentialBackoff || o.MaxDelayMs > o.BaseDelayMs,
"MaxDelayMs must exceed BaseDelayMs when using exponential backoff")
.ValidateOnStart();
}Hızlı Kontrol
Seçenekleri kaydederken ValidateOnStart() çağrısı yapmanın yararı nedir?
Özet: Seçenek Doğrulama ve Adlandırılmış Seçenekler
Önemli çıkarımlar:
ValidateOnStart(): ilk kullanımda değil, başlangıçta hata verir- DataAnnotations:
[Required],[Range]ve diğerleri +ValidateDataAnnotations() Validate(Func, message): özellikler arası kurallar için satır içi lambdaIValidateOptions<T>: birden çok hatayla tam programatik doğrulama- Adlandırılmış seçenekler:
Configure<T>(name, ...)+IOptionsMonitor<T>.Get(name) OptionsBuilder<T>: tüm kaydetme adımlarını zincirleyen akıcı programlama arayüzü
Sıkça Sorulan Sorular
“Seçenek Doğrulama ve Adlandırılmış Seçenekler” dersi ücretsiz mi?
Evet — “Seçenek Doğrulama ve Adlandırılmış 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.
“Seçenek Doğrulama ve Adlandırılmış Seçenekler” dersinde ne öğreneceğim?
Seçenekleri başlangıçta DataAnnotations veya FluentValidation ile doğrulayın, birden çok örnek için adlandırılmış seçenekleri kullanı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 3. dersidir.
“Seçenek Doğrulama ve Adlandırılmış 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