.NET6之MiniAPI(五):选项
選項是配置一個升級版,一般情況下是把一個范圍內的配置包裝成類型,以供使用,比如下面的RedisSetting,是Redis的配置參數:
可以采用下面的形式把配置類型?實體注入到容器(因為沒有說注入這個知識點,這里可以理解為初始化)中。
選項分為三種:普通選項目IOptions,熱更新選項IOptionsSnapshot,監控選項IOptionsMonitor,下面分別說明。
IOptions選項
Demo結果
熱加載選項:IOptionsSnapshot
結果
更新配置ConnectionTimeOut為15ms,在不重啟服務的情況下,再次請求,結果會變成15ms
監控選項:IOptionsMonitor
調用監控
當把ConnectionTimeOut更新成20ms時,OnChange會被觸發,日志會打印出來
利用監控特性可以與報警聯合起來,當監控到配置有變化時,通知服務相關人知曉,是人為設置,還是被篡改,以便采取措施。
選項命名:
當相同的配置有兩組時,選項命名就非常有用了,比如一主一備
"RedisSettings": {"Main": {"Host": "127.0.0.1","Port": 6379,"Password": "123","ConnectionTimeOut": "10ms"},"Prepare": {"Host": "127.0.0.1","Port": 6380,"Password": "456","ConnectionTimeOut": "12ms"}}實體類可以用靜態常量區分開來
分別注入配置即可
不過只有IOptionsSnapshot和IOptionsMonitor能通過Get方法來獲取命名的配置,IOptions沒有實現Get方法
另外,為了提高配置數據的安全性,可以給配置選項增加驗證,可以通過在配置實體類上增加DataAnnotations來驗證,也可以自定義驗證
public record RedisSetting {public string? Host { get; set; }public int Port { get; set; }public string? Password { get; set; }[RegularExpression(@"^\d+ms$", ErrorMessage = "格式不正確,必須是ms")]public string? ConnectionTimeOut { get; set; } }上面的ConnectionTimeOut是DataAnnotations方式,下面是自定義驗證模式。
如果驗證更復雜,可以自定義類實現,如下:
public class RedisSettingValidation : IValidateOptions<RedisSetting> {public RedisSetting _config { get; init; }public RedisSettingValidation(IConfiguration config){_config = config.GetSection("RedisSetting").Get<RedisSetting>();}public ValidateOptionsResult Validate(string name, RedisSetting options){string? vor=null;var rx = new Regex(@"^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$");if (options != null&&options.Host!=null){var match = rx.Match(options.Host);if (string.IsNullOrEmpty(match.Value)){vor = $"{options.Host} 格式不正確";}if (vor != null){return ValidateOptionsResult.Fail(vor);}}return ValidateOptionsResult.Success;} }添加驗證類型
總結
以上是生活随笔為你收集整理的.NET6之MiniAPI(五):选项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 容器界的新“朋友”
- 下一篇: iNeuOS工业互联网操作系统,矿山动态