Options Bertipe Kuat dengan IOptions
Ikat bagian konfigurasi ke kelas POCO menggunakan IOptions , IOptionsSnapshot , dan IOptionsMonitor .
Options Bertipe Kuat dengan IOptions adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Mengapa Menggunakan Opsi Bertipe Kuat?
Membaca konfigurasi dengan IConfiguration["Key"] menghasilkan string tanpa tipe. Pola Options memetakan bagian konfigurasi ke kelas C#, sehingga memberikan keamanan tipe saat kompilasi, IntelliSense, dan dukungan validasi.
Mendefinisikan Kelas Options
Buat kelas POCO biasa yang nama propertinya cocok dengan kunci JSON Anda. Berdasarkan konvensi, tambahkan konstanta statis SectionName untuk mengidentifikasi bagian konfigurasi.
// 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
}
}Mendaftarkan Options
Panggil Configure<T> untuk mengikat bagian konfigurasi ke kelas options. Ini mendaftarkan IOptions<T>, IOptionsSnapshot<T>, dan IOptionsMonitor<T> dalam DI.
// 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 vs IOptionsSnapshot vs IOptionsMonitor
Ada tiga jenis dengan masa hidup dan perilaku pemuatan ulang yang berbeda. Pilih yang tepat untuk kasus penggunaan Anda.
// 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);
}Validasi Options dengan Atribut
Beri atribut System.ComponentModel.DataAnnotations pada properti options dan panggil ValidateDataAnnotations() agar aplikasi gagal segera saat mulai jika konfigurasi tidak valid.
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 useValidasi Kustom dengan IValidateOptions
Untuk aturan kompleks lintas properti, implementasikan IValidateOptions<T> guna memperoleh logika validasi terprogram secara menyeluruh.
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>();Konfigurasi Pascaproses
PostConfigure berjalan setelah semua pemanggilan Configure dan memungkinkan Anda menimpa atau menurunkan nilai — berguna untuk properti hasil perhitungan atau penyesuaian khusus lingkungan.
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 validatorsOptions Bernama
Jika Anda memerlukan beberapa instans dari tipe options yang sama, misalnya dua server SMTP, gunakan options bernama untuk membedakannya.
// 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");
}
}Singkatan BindConfiguration
Rangkaian AddOptions().BindConfiguration() adalah cara modern berbasis fluent untuk mendaftarkan, mengikat, memvalidasi, dan gagal segera dalam satu ekspresi.
// 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();Penerapan di Dunia Nyata: Options Flag Fitur
Penyiapan options flag fitur yang lengkap dengan dukungan pemuatan ulang, sehingga sakelar dapat diubah dalam appsettings tanpa penerapan ulang.
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");
}Pemeriksaan Singkat
Varian IOptions mana yang harus digunakan dalam layanan tunggal yang perlu mencerminkan perubahan konfigurasi langsung?
Ringkasan: Options Bertipe Kuat dengan IOptions
Poin penting:
- Pola Options mengikat bagian konfigurasi ke POCO melalui
Configure<T>atauAddOptions<T>().BindConfiguration() IOptions<T>: tunggal, membaca satu kali saat mulaiIOptionsSnapshot<T>: bercakupan, dimuat ulang untuk setiap permintaan — jangan menyuntikkannya ke layanan tunggalIOptionsMonitor<T>: aman untuk layanan tunggal, menyediakanCurrentValuelangsung +OnChange- Validasi dengan DataAnnotations +
ValidateDataAnnotations()+ValidateOnStart() - Options bernama untuk beberapa instans dari tipe yang sama
Belajar C# dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Options Bertipe Kuat dengan IOptions” gratis?
Ya — teks lengkap “Options Bertipe Kuat dengan IOptions” 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 “Options Bertipe Kuat dengan IOptions”?
Ikat bagian konfigurasi ke kelas POCO menggunakan IOptions , IOptionsSnapshot , dan IOptionsMonitor . 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 2 dari 4.
Berapa lama pelajaran “Options Bertipe Kuat dengan IOptions” 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
- Sumber & Penyedia Konfigurasi
- Options Bertipe Kuat dengan IOptions
- Validasi Options & Options Bernama
- Pengelolaan Rahasia