日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET6之MiniAPI(五):选项

發(fā)布時間:2023/12/4 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET6之MiniAPI(五):选项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

選項是配置一個升級版,一般情況下是把一個范圍內(nèi)的配置包裝成類型,以供使用,比如下面的RedisSetting,是Redis的配置參數(shù):

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts":?"*",?"RedisSetting": {"Host": "127.0.0.1","Port": 6379,"Password": "123","ConnectionTimeOut": "10ms"} }

可以采用下面的形式把配置類型?實體注入到容器(因為沒有說注入這個知識點,這里可以理解為初始化)中。

var?builder?=?WebApplication.CreateBuilder(); builder.Services.Configure<RedisSetting>(builder.Configuration.GetSection("RedisSetting")); var?app?=?builder.Build();

選項分為三種:普通選項目IOptions,熱更新選項IOptionsSnapshot,監(jiān)控選項IOptionsMonitor,下面分別說明。

IOptions選項

app.MapGet("/appinfo", (IOptions<RedisSetting> options) => {return options.Value; });

Demo結(jié)果

熱加載選項:IOptionsSnapshot

app.MapGet("/snapshot", (IOptionsSnapshot<RedisSetting> options) => {return options.Value; });

結(jié)果

更新配置ConnectionTimeOut為15ms,在不重啟服務(wù)的情況下,再次請求,結(jié)果會變成15ms

監(jiān)控選項:IOptionsMonitor

app.MapGet("/monitorstart", (IOptionsMonitor<RedisSetting> options) => {options.OnChange(redisSetting =>{app.Logger.LogInformation(options.CurrentValue.ToString()); });return "Ok"; });

調(diào)用監(jiān)控

當(dāng)把ConnectionTimeOut更新成20ms時,OnChange會被觸發(fā),日志會打印出來

利用監(jiān)控特性可以與報警聯(lián)合起來,當(dāng)監(jiān)控到配置有變化時,通知服務(wù)相關(guān)人知曉,是人為設(shè)置,還是被篡改,以便采取措施。

選項命名:

當(dāng)相同的配置有兩組時,選項命名就非常有用了,比如一主一備

"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"}}

實體類可以用靜態(tài)常量區(qū)分開來

public record RedisSetting {public const string Main = "Main";public const string Prepare = "Prepare";public string? Host { get; set; }public int Port { get; set; }public string? Password { get; set; }public string? ConnectionTimeOut { get; set; } }

分別注入配置即可

builder.Services.Configure<RedisSetting>(RedisSetting.Main,builder.Configuration.GetSection("RedisSettings:Main")); builder.Services.Configure<RedisSetting>(RedisSetting.Prepare,builder.Configuration.GetSection("RedisSettings:Prepare"));

不過只有IOptionsSnapshot和IOptionsMonitor能通過Get方法來獲取命名的配置,IOptions沒有實現(xiàn)Get方法

app.MapGet("/snapshotredissetting", (IOptionsSnapshot<RedisSetting> options) => {return options.Get(RedisSetting.Main); }); app.MapGet("/monitorstart", (IOptionsMonitor<RedisSetting> options) => {options.OnChange(redisSetting =>{app.Logger.LogInformation(options.Get(RedisSetting.Main).ToString());app.Logger.LogInformation(options.Get(RedisSetting.Prepare).ToString());});return options.CurrentValue; });

另外,為了提高配置數(shù)據(jù)的安全性,可以給配置選項增加驗證,可以通過在配置實體類上增加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方式,下面是自定義驗證模式。

builder.Services.AddOptions<RedisSetting>().Bind(builder.Configuration.GetSection("RedisSetting")).ValidateDataAnnotations().Validate(config =>{if (config.Port < 1000){return false;}return true;}, "端口不能少于1000");

如果驗證更復(fù)雜,可以自定義類實現(xiàn),如下:

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;} }

添加驗證類型

builder.Services.Configure<RedisSetting>(builder.Configuration.GetSection("RedisSetting")); builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IValidateOptions<RedisSetting>, RedisSettingValidation>());

總結(jié)

以上是生活随笔為你收集整理的.NET6之MiniAPI(五):选项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。