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.
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
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
- DI Kapsayıcılarının Temelleri
- Hizmet Ömürleri: Geçici, Kapsamlı, Singleton
- Kurucu Enjeksiyonu ve Arayüzler
- Fabrika ve Seçenekler Desenleri