DEV Community

ian chen
ian chen

Posted on • Edited on

.NET Core 中的 `IOptions` 介紹

在 .NET Core(現在統一稱為 .NET)中,IOptions 是一種用來讀取設定檔的設計模式。它提供強型別的方式,讓你能從 appsettings.json 或其他來源讀取資料,並注入到你的服務中。


✅ 為什麼要用 IOptions

  • ✅ 強型別支援:比 Configuration["Key"] 更安全、更容易維護
  • ✅ 支援依賴注入(DI):讓設定更容易測試與使用
  • ✅ 支援監控與更新(使用 IOptionsSnapshotIOptionsMonitor

🛠 基本用法

1. appsettings.json

{
  "MySettings": {
    "SiteName": "My Cool Site",
    "EnableFeatureX": true
  }
}
Enter fullscreen mode Exit fullscreen mode

2. 建立設定類別

public class MySettings
{
    public string SiteName { get; set; }
    public bool EnableFeatureX { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

3. 在 Program.cs 或 Startup.cs 中綁定設定

builder.Services.Configure<MySettings>(
    builder.Configuration.GetSection("MySettings"));
Enter fullscreen mode Exit fullscreen mode

4. 在服務中使用設定

public class MyService
{
    private readonly MySettings _settings;

    public MyService(IOptions<MySettings> options)
    {
        _settings = options.Value;
    }

    public void Show()
    {
        Console.WriteLine(_settings.SiteName);
    }
}
Enter fullscreen mode Exit fullscreen mode

🔄 IOptions 相關介面比較

介面類型 功能說明
IOptions<T> 一般用途,讀取設定值,啟動後不會變動
IOptionsSnapshot<T> 每次 DI 解析時會重新載入(適合 Scope 生命周期)
IOptionsMonitor<T> 支援即時監聽設定變更(適合 Singleton)

❓ 綁定失敗會怎樣?

  • 若 JSON 少了某個欄位,該屬性會使用預設值(如 string 為 null、bool 為 false)
  • 不會拋例外
  • 若 JSON 值型別錯誤(如把布林值寫成字串),則會拋例外

🛡️ 加入設定驗證(推薦)

1. 使用資料註解(Data Annotations)

using System.ComponentModel.DataAnnotations;

public class MySettings
{
    [Required]
    public string SiteName { get; set; }

    public bool EnableFeatureX { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

2. 註冊時啟用驗證

builder.Services
    .AddOptions<MySettings>()
    .Bind(builder.Configuration.GetSection("MySettings"))
    .ValidateDataAnnotations()
    .ValidateOnStart(); // 啟動時驗證,錯誤會拋例外
Enter fullscreen mode Exit fullscreen mode

這樣可以防止設定漏填,讓錯誤在啟動階段就被發現,而不是等到執行時才出問題。


📌 小結

  • IOptions<T> 是強型別、安全、支援 DI 的設定綁定方式
  • 預設為寬鬆綁定,欄位缺漏不會報錯
  • 若需強制驗證設定完整性,建議搭配 ValidateDataAnnotations()ValidateOnStart()

Top comments (0)