Pola Factory & Options
Gunakan delegasi factory, IServiceProvider, dan pola Options untuk menangani dependency bersyarat atau yang dapat dikonfigurasi.
Pola Factory & Options adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Saat Injeksi Konstruktor Belum Cukup
Terkadang Anda perlu membuat layanan secara kondisional, berdasarkan data runtime, atau mengonfigurasinya secara berbeda untuk setiap kasus penggunaan. Di sinilah pola pabrik dan pola opsi sangat berguna.
Delegat Pabrik dengan AddTransient
Anda dapat meneruskan delegat pabrik ke AddTransient, AddScoped, atau AddSingleton. Delegat tersebut menerima IServiceProvider, sehingga Anda dapat menyelesaikan layanan lainnya.
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);
});Opsi Bernama dengan IOptionsSnapshot
Pola opsi mengikat bagian konfigurasi ke kelas bertipe kuat. Gunakan IOptions<T> untuk singleton dan IOptionsSnapshot<T> untuk nilai yang diperbarui pada setiap permintaan.
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;
}IOptionsMonitor untuk Pemuatan Ulang Langsung
IOptionsMonitor<T> menyediakan nilai opsi terkini saat diakses dan memberi tahu Anda ketika konfigurasi berubah — sangat cocok untuk Singleton yang memerlukan pembaruan konfigurasi secara langsung.
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);
}
}Opsi Bernama
Opsi bernama memungkinkan Anda mendaftarkan beberapa konfigurasi dengan jenis yang sama. Gunakan Configure<T>(name, ...) dan selesaikan dengan IOptionsSnapshot<T>.Get(name).
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");
}
}Memvalidasi Opsi saat Aplikasi Dimulai
Gunakan ValidateDataAnnotations() atau validator khusus untuk memastikan konfigurasi sudah benar sebelum aplikasi dimulai. Gabungkan dengan ValidateOnStart() agar aplikasi segera gagal ketika terjadi kesalahan.
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();Pola Pabrik Abstrak
Antarmuka pabrik abstrak memungkinkan Anda menyuntikkan pabrik ke dalam layanan dan menunda pembuatan sampai data runtime tersedia — tanpa membuat dependensi langsung pada IServiceProvider.
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>();Layanan Berkunci (.NET 8)
.NET 8 memperkenalkan layanan berkunci: daftarkan beberapa implementasi dengan kunci yang berbeda, lalu selesaikan implementasi yang tepat menggunakan [FromKeyedServices] atau GetKeyedService.
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) { }PostConfigure untuk Penggantian
PostConfigure dijalankan setelah semua pemanggilan Configure. Gunakan untuk menerapkan penggantian dalam pengujian atau menegakkan invarian, apa pun konfigurasi yang dimuat.
// In integration tests: force test values after real config
builder.Services.PostConfigure<SmtpSettings>(opts =>
{
opts.Host = "smtp.test.local";
opts.Port = 25;
});Metode Ekstensi IServiceCollection
Kemas pendaftaran Anda ke dalam metode ekstensi agar Program.cs tetap rapi dan modul dapat digunakan kembali di berbagai proyek.
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);Dunia Nyata: Notifikasi Multi-Penyedia
Dengan menggunakan pabrik dan opsi bernama secara bersamaan, Anda dapat memilih penyedia notifikasi yang tepat saat runtime berdasarkan preferensi pengguna yang tersimpan di basis data.
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);
}
}Pemeriksaan Singkat
Antarmuka mana yang menyediakan nilai opsi terkini AND memberi tahu saat konfigurasi berubah, sehingga cocok untuk layanan Singleton?
Rangkuman: Pola Pabrik & Opsi
Hal-hal penting:
- Delegat pabrik dalam metode
Add*memungkinkan pembuatan layanan secara kondisional atau berdasarkan konfigurasi runtime - Pola opsi mengikat bagian konfigurasi ke kelas POCO bertipe kuat
IOptions= statis,IOptionsSnapshot= per permintaan,IOptionsMonitor= pembaruan langsung- Validasi opsi saat aplikasi dimulai dengan
ValidateDataAnnotations().ValidateOnStart() - Layanan berkunci (.NET 8) menggantikan solusi sementara berbasis pabrik untuk implementasi bernama
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola Factory & Options” gratis?
Ya — teks lengkap “Pola Factory & Options” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pola Factory & Options”?
Gunakan delegasi factory, IServiceProvider, dan pola Options untuk menangani dependency bersyarat atau yang dapat dikonfigurasi. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pola Factory & Options” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar Kontainer DI
- Masa Hidup Layanan: Transient, Scoped, Singleton
- Injection Konstruktor & Interface
- Pola Factory & Options