0Pricing
C# Academy · Ders

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 use

IValidateOptions 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 validators

Adlandı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> veya AddOptions<T>().BindConfiguration() aracılığıyla POCO'lara bağlar
  • IOptions<T>: Tekil, başlangıçta bir kez okur
  • IOptionsSnapshot<T>: Kapsam ömürlüdür, istek başına yeniden yüklenir; tekil hizmetlere eklemeyin
  • IOptionsMonitor<T>: Tekil kullanıma uygundur; canlı CurrentValue + OnChange sağ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

  1. Yapılandırma Kaynakları ve Sağlayıcıları
  2. IOptions ile Güçlü Türlendirilmiş Seçenekler
  3. Seçenek Doğrulama ve Adlandırılmış Seçenekler
  4. Gizli Bilgilerin Yönetimi
← C# Academy Sayfasına Dön