## [.NET 筆記 012] .NET 強型別設定:Options Pattern 與 Configuration Binder ###### 📅 2026-04-29 ### 📌 何謂 .NET 強型別設定? .NET 強型別設定 (Strongly Typed Configuration): 「將設定資料(如 appsettings.json)轉換為具有明確型別的 C# 類別, 並透過「Options Pattern + DI」:安全、可維護地存取與使用的機制。」 ### 📌 .NET 強型別設定的步驟 ``` 1. 讀設定檔 appsettings.json → IConfiguration 2. 綁定為強型別物件 Configuration Binder: 負責把設定資料(JSON / IConfiguration)轉成 class(強型別物件) 3. 設定管理與使用 Options Pattern: 負責將設定註冊到 DI,並提供統一存取方式 (IOptions<T> / IOptionsSnapshot<T> / IOptionsMonitor<T>) 最後,在 Service / Controller 使用 (DI = 依賴注入 = Dependency Injection) ``` --- ### 📌 Step-0(a). 開啟專案 承接上一篇 [[.NET 筆記 011]](https://hackmd.io/@dada00321/Hy89EaT6We) ➡️ API_test_260428 ### 📌 Step-0(b). Review 原本的 JWT 設定 (JSON) 專案 (API_test_260428) > appsetting.json 裡面原本 "JWT 設定" 寫法如下 ``` "JwtSettings": { "SecretKey": "48d67a0b-3fc7-4dc2-b641-2c625a4c7ed4", // 密鑰 | 至少 32 位數 (此處 36 位數) "Issuer": "dada00321", // 發行者 "Audience": "dada00321" // 受眾 }, ``` ### 📌 Step-1. 建立設定 class: JwtSetting.cs 專案按右鍵 → 新增資料夾 Settings 右鍵: Settings → 新增類別 JwtSettings.cs: ``` namespace API_test_260428.Settings { public class JwtSettings { public string SecretKey { get; set; } = ""; public string Issuer { get; set; } = ""; public string Audience { get; set; } = ""; } } ``` ### 📌 Step-2. Program.cs 登記 在 builder.Services.AddControllers(); 上面加: ``` // 將 appsettings.json 的 "JwtSettings" 綁定到 JwtSettings class builder.Services.Configure<JwtSettings>( builder.Configuration.GetSection("JwtSettings") ); ``` --- 接著,修改 Program.cs 裡原本讀 JWT 設定的寫法: 將原本的寫法(用 "魔法字串" 讀取 JSON) ``` var _jwtSetting = builder.Configuration.GetSection("jwtSettings"); var _securityKey = _jwtSetting["SecretKey"] ?? ""; var _issuer = _jwtSetting["Issuer"]; var _audience = _jwtSetting["Audience"]; var _key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_securityKey)); ``` 改寫成以下寫法(用 "強型別" 讀取 Class) ``` var jwtSettings = builder.Configuration .GetSection("JwtSettings") .Get<JwtSettings>()!; var _key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey)); var _issuer = jwtSettings.Issuer; var _audience = jwtSettings.Audience; ``` ### 📌 Step-3. AuthService 改成注入 JwtSettings 修改 Services/AuthService.cs 註解掉將原本的寫法 ``` // private readonly IConfiguration _config; /* var secretKey = _config["JwtSettings:SecretKey"] ?? ""; var issuer = _config["JwtSettings:Issuer"]; var audience = _config["JwtSettings:Audience"]; */ /* var secretKey = _config["JwtSettings:SecretKey"] ?? ""; var issuer = _config["JwtSettings:Issuer"]; var audience = _config["JwtSettings:Audience"]; */ ``` 改寫成以下寫法 ``` using API_test_260428.Settings; using Microsoft.Extensions.Options; public class AuthService: IScopedService { // 建構子改成注入 JwtSettings private readonly JwtSettings _jwtSettings; public AuthService(DeviceMonitorDbContext context, IOptions<JwtSettings> jwtOptions) { _context = context; _jwtSettings = jwtOptions.Value; // .Value 才是真正的 JwtSettings 物件 } // 直接用屬性取值,有型別、有自動補字 var secretKey = _jwtSettings.SecretKey; var issuer = _jwtSettings.Issuer; var audience = _jwtSettings.Audience; } ``` ### 📌 Step-4. 測試 => 完成 完成「.NET 強型別設定」改寫後,若無紅字,並透過 Swagger UI 測試都沒問題,就成功囉