C# Academy · Ders

Fabrika ve Seçenekler Desenleri

Koşullu veya yapılandırılabilir bağımlılıkları yönetmek için fabrika temsilcilerini, IServiceProvider'ı ve Options desenini kullanın.

4. ders / 413 adım

Fabrika ve Seçenekler Desenleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. 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.

Yapıcı Üzerinden Bağımlılık Ekleme Yetmediğinde

Bazen çalışma zamanı verilerine göre koşullu olarak hizmetler oluşturmanız veya bunları kullanım senaryosuna göre farklı biçimde yapılandırmanız gerekir. Fabrika kalıpları ve Seçenekler kalıbı bu noktada öne çıkar.

AddTransient ile Fabrika Temsilcileri

AddTransient, AddScoped veya AddSingleton yöntemlerine bir fabrika temsilcisi aktarabilirsiniz. Temsilci, diğer hizmetleri çözümleyebilmeniz için IServiceProvider alır.

builder.Services.AddTransient<IPaymentGateway>(sp =>
{
    var config = sp.GetRequiredService<IOptions<PaymentConfig>>().Value;
    return config.Provider == "stripe"
        ? new StripeGateway(config.ApiKey)
        : new PayPalGateway(config.ClientId, config.Secret);
});

IOptionsSnapshot ile Adlandırılmış Seçenekler

Seçenekler kalıbı, yapılandırma bölümlerini güçlü türlere sahip sınıflara bağlar. Tekil hizmetler için IOptions<T>, istek başına yenilenen değerler için IOptionsSnapshot<T> kullanın.

public class SmtpSettings
{
    public string Host { get; set; } = "";
    public int Port { get; set; } = 587;
    public string Username { get; set; } = "";
}

// Registration
builder.Services.Configure<SmtpSettings>(
    builder.Configuration.GetSection("Smtp"));

// Consumption
public class EmailService
{
    private readonly SmtpSettings _settings;
    public EmailService(IOptions<SmtpSettings> opts)
        => _settings = opts.Value;
}

Canlı Yenileme için IOptionsMonitor

IOptionsMonitor<T>, erişim anındaki güncel seçenek değerini sağlar ve yapılandırma değiştiğinde sizi bilgilendirir — canlı yapılandırma güncellemelerine ihtiyaç duyan Tekil hizmetler için idealdir.

public class FeatureFlagService
{
    private readonly IOptionsMonitor<FeatureFlags> _monitor;

    public FeatureFlagService(IOptionsMonitor<FeatureFlags> monitor)
        => _monitor = monitor;

    public bool IsEnabled(string flag)
    {
        // Always reads the latest config value
        return _monitor.CurrentValue.Flags.GetValueOrDefault(flag);
    }
}

Adlandırılmış Seçenekler

Adlandırılmış seçenekler, aynı türün birden çok yapılandırmasını kaydetmenize olanak tanır. Configure<T>(name, ...) kullanın ve IOptionsSnapshot<T>.Get(name) ile çözümleyin.

builder.Services.Configure<S3Settings>("primary",
    builder.Configuration.GetSection("S3:Primary"));
builder.Services.Configure<S3Settings>("backup",
    builder.Configuration.GetSection("S3:Backup"));

public class S3Service
{
    public S3Service(IOptionsSnapshot<S3Settings> opts)
    {
        var primary = opts.Get("primary");
        var backup  = opts.Get("backup");
    }
}

Başlangıçta Seçenekleri Doğrulama

Uygulama başlamadan önce yapılandırmanın doğru olduğundan emin olmak için ValidateDataAnnotations() veya özel bir doğrulayıcı kullanın. Hızlı başarısız olma davranışı için bunu ValidateOnStart() ile birleştirin.

public class SmtpSettings
{
    [Required] public string Host { get; set; } = "";
    [Range(1, 65535)] public int Port { get; set; } = 587;
}

builder.Services
    .AddOptions<SmtpSettings>()
    .Bind(builder.Configuration.GetSection("Smtp"))
    .ValidateDataAnnotations()
    .ValidateOnStart();

Soyut Fabrika Kalıbı

Soyut bir fabrika arayüzü, hizmetlere bir fabrika eklemenize ve oluşturma işlemini çalışma zamanı verileri kullanılabilir olana kadar ertelemenize olanak tanır — bunu doğrudan IServiceProvider bağımlılığı almadan yapar.

public interface IReportFactory
{
    IReport Create(string reportType);
}

public class ReportFactory : IReportFactory
{
    private readonly IServiceProvider _sp;
    public ReportFactory(IServiceProvider sp) => _sp = sp;

    public IReport Create(string reportType) => reportType switch
    {
        "pdf"  => _sp.GetRequiredService<PdfReport>(),
        "excel"=> _sp.GetRequiredService<ExcelReport>(),
        _      => throw new ArgumentException("Unknown type")
    };
}

builder.Services.AddTransient<IReportFactory, ReportFactory>();

Anahtarlı Hizmetler (.NET 8)

.NET 8, anahtarlı hizmetleri kullanıma sunar: Birden çok uygulamayı farklı anahtarlar altında kaydedebilir ve doğru olanı [FromKeyedServices] veya GetKeyedService ile çözümleyebilirsiniz.

builder.Services.AddKeyedScoped<IPaymentGateway, StripeGateway>("stripe");
builder.Services.AddKeyedScoped<IPaymentGateway, PayPalGateway>("paypal");

// Resolve in a class:
public class CheckoutService(
    [FromKeyedServices("stripe")] IPaymentGateway stripe,
    [FromKeyedServices("paypal")]  IPaymentGateway paypal) { }

Geçersiz Kılmalar için PostConfigure

PostConfigure, tüm Configure çağrılarından sonra çalışır. Sınamalarda geçersiz kılmalar uygulamak veya hangi yapılandırmanın yüklendiğinden bağımsız olarak değişmezleri zorunlu kılmak için kullanın.

// In integration tests: force test values after real config
builder.Services.PostConfigure<SmtpSettings>(opts =>
{
    opts.Host = "smtp.test.local";
    opts.Port = 25;
});

IServiceCollection Uzantı Metotları

Kayıtlarınızı Program.cs'i temiz tutacak ve modülleri projeler arasında yeniden kullanılabilir hâle getirecek uzantı metotları içinde paketleyin.

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddPaymentServices(
        this IServiceCollection services,
        IConfiguration config)
    {
        services.Configure<PaymentConfig>(config.GetSection("Payment"));
        services.AddScoped<IPaymentGateway, StripeGateway>();
        services.AddScoped<PaymentService>();
        return services;
    }
}

// Usage in Program.cs:
builder.Services.AddPaymentServices(builder.Configuration);

Gerçek Dünya: Birden Çok Sağlayıcıyla Bildirim

Fabrika ve adlandırılmış seçenekleri birlikte kullanarak, veritabanında saklanan kullanıcı tercihine göre çalışma zamanında doğru bildirim sağlayıcısını seçebilirsiniz.

builder.Services.AddKeyedScoped<INotifier, EmailNotifier>("email");
builder.Services.AddKeyedScoped<INotifier, SmsNotifier>("sms");
builder.Services.AddKeyedScoped<INotifier, PushNotifier>("push");

public class NotificationService
{
    private readonly IServiceProvider _sp;
    public NotificationService(IServiceProvider sp) => _sp = sp;

    public Task SendAsync(string channel, string message)
    {
        var notifier = _sp.GetRequiredKeyedService<INotifier>(channel);
        return notifier.SendAsync(message);
    }
}

Hızlı Kontrol

Güncel seçenek değerini sağlayan AND yapılandırma değişikliklerini bildiren, bu nedenle Tekil hizmetler için uygun olan arayüz hangisidir?

Özet: Fabrika ve Seçenekler Kalıpları

Temel çıkarımlar:

  • Add* metotlarındaki fabrika temsilcileri, koşullu veya çalışma zamanında yapılandırılan hizmet oluşturmayı sağlar
  • Seçenekler kalıbı, yapılandırma bölümlerini güçlü türlere sahip POCO'lara bağlar
  • IOptions = sabit, IOptionsSnapshot = istek başına, IOptionsMonitor = canlı güncellemeler
  • Seçenekleri başlangıçta ValidateDataAnnotations().ValidateOnStart() ile doğrulayın
  • Anahtarlı hizmetler (.NET 8), adlandırılmış uygulamalar için fabrika çözümlerinin yerini alır
Başlamak ücretsiz

Yapay zeka eğitmeniyle C# öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
93
Dersler
346

Sıkça Sorulan Sorular

“Fabrika ve Seçenekler Desenleri” dersi ücretsiz mi?

Evet — “Fabrika ve Seçenekler Desenleri” 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.

“Fabrika ve Seçenekler Desenleri” dersinde ne öğreneceğim?

Koşullu veya yapılandırılabilir bağımlılıkları yönetmek için fabrika temsilcilerini, IServiceProvider'ı ve Options desenini 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 4. dersidir.

“Fabrika ve Seçenekler Desenleri” 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. DI Kapsayıcılarının Temelleri
  2. Hizmet Ömürleri: Geçici, Kapsamlı, Singleton
  3. Kurucu Enjeksiyonu ve Arayüzler
  4. Fabrika ve Seçenekler Desenleri
← C# Academy Sayfasına Dön