.NET6之MiniAPI(五):选项

选项是配置一个升级版,一般情况下是把一个范围内的配置包装成类型,以供使用,比如下面的RedisSetting,是Redis的配置参数:

{"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,监控选项IOptionsMonitor,下面分别说明。

IOptions选项

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

Demo结果

b122b9ecb0049e13aa0ba7cb118655c8.png

热加载选项:IOptionsSnapshot

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

结果

203d8984cd9d685959eb7ac2755be416.png

更新配置ConnectionTimeOut为15ms,在不重启服务的情况下,再次请求,结果会变成15ms

5a8475a692bf4e94f5a0d721196a7af8.png

监控选项:IOptionsMonitor

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

调用监控

6a8c75512e64afbadac7a8b2624c1560.png

当把ConnectionTimeOut更新成20ms时,OnChange会被触发,日志会打印出来

8e62cbed20a8c0207413785621cf1f76.png

利用监控特性可以与报警联合起来,当监控到配置有变化时,通知服务相关人知晓,是人为设置,还是被篡改,以便采取措施。

选项命名:

当相同的配置有两组时,选项命名就非常有用了,比如一主一备

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

实体类可以用静态常量区分开来

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没有实现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;
});

另外,为了提高配置数据的安全性,可以给配置选项增加验证,可以通过在配置实体类上增加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");

如果验证更复杂,可以自定义类实现,如下:

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>());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决nginx不支持pathinfo Thinkphp命名空间问题

1.这是我Ubuntu14.4配置文件server { listen 9989 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Note: You should disable gzip for SSL traffic. # See: https://bugs.debia…

Oracle常用知识总结

1.曾经不小心把开发库的数据库表全部删除&#xff0c;当时吓的要死。结果找到下面的语句恢复到了1个小时之前的数据&#xff01;很简单。 注意使用管理员登录系统&#xff1a; select * from 表名 as of timestamp sysdate-1/12 //查询两个小时前的某表数据&#xff01;既然两…

Android之项目中调用已有.so库

注意该.so库指的是android平台的&#xff0c;非一般linux、unix平台&#xff1b; 1、现有库libcom_ycan_testLib.so 2、新建android项目TestLib2 3、添加新类&#xff1a; 类名&#xff1a;testLib 包路径&#xff1a;参考现有库名&#xff0c;应为com.ycan 4、在新类中声明库的…

数组面试题--数组求和

题目描述&#xff1a;给定一个数组&#xff0c;实现函数用一行代码返回这个数组的和 思路&#xff1a;递归即可 1 #include <iostream>2 #include <queue>3 #include <climits>4 #include <algorithm>5 #include <memory.h>6 #include <stdio…

iNeuOS工业互联网操作系统,矿山动态产量计量系统和铁路车辆识别系统应用场景案例...

目 录1. 概述... 22. 平台演示... 23. 矿山动态产量计量系统... 24. 铁路车辆识别系统... 41. 概述iNeuOS工业互联网操作系统增加矿山动态产量计量和铁路车辆识别系统&#xff0c;提高矿山动态产量计量精度和完全避免产量核实误差的情况&#xff1…

85元一个万能工具箱,配齐24种螺丝刀+扳手,媲美德国工艺,家庭必备

▲ 点击查看对当代的男生来说&#xff0c;有什么技能是必须掌握的&#xff1f;自然是修理各种各样的东西啦~除了修电脑&#xff0c;还要修各种电器啊、家具啊之类的&#xff0c;讲真&#xff0c;会修理的男人都很帅&#xff01;实用性能也满分&#xff0c;相当于女孩子会做饭一…

poj1505

题意&#xff1a;给出一个数列有n个数&#xff0c;要求用分割分把这个数列分成m段&#xff0c;不能改变原数列的顺序。每段至少一个数。求使得加和最大的那段的加和最小的划分方案。如果有多组解的话先要保证第一段和尽量小&#xff0c;若仍有多组解&#xff0c;要先保证第二段…

mysql出现连接错误不识别 utf8mb4

2019独角兽企业重金招聘Python工程师标准>>> 出现这样的错误&#xff0c;指的是不识别该字符集。 可能是 数据库 里面配置 或者是 连接属性 配置了该字符集那么修改回来即可。 还有一种情况就是 &#xff0c;java-connert-sql连接包&#xff0c;版本太低了。比如 低…

Android之录音--AudioRecord、MediaRecorder

Android提供了两个API用于实现录音功能&#xff1a;android.media.AudioRecord、android.media.MediaRecorder。 网上有很多谈论这两个类的资料。现在大致总结下&#xff1a; 1、AudioRecord 主要是实现边录边播&#xff08;AudioRecordAudioTrack&#xff09;以及对音频的实时…

JSFL 获取当前脚本路径,执行其他脚本

Application.jsfl为程序入口&#xff0c;导入其他jsfl 【Common.jsfl】function trace() {fl.trace(Array.prototype.join.call(arguments, " ")); } 【Application.jsfl】var JSFL_PATH fl.scriptURI.substr(0,fl.scriptURI.lastIndexOf("/")1); var inc…

一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

前言之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介GitHub开源地址:l2999019/GZY.Quartz.MUI: 基于Quartz的轻量级,注入化的UI组件 总而言之,这个组件主要想做的就是:像swaggerUI一样,项目入侵量小,仅需要在Startup中注…

越绿自己,就会越强?

1 我们要求不高的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 小区的猫竟然通过监控抓老鼠&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 不同职业的相亲对象&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 别人家的年终奖&#xff0c…

oracle死锁解决常用方法(屡试不爽)

--1.查询被锁的情况 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id  o.object_id and l.session_ids.sid; --2.用下面语句kill掉死锁的进程 alter system kill session 24,111; --(其中24,111分别是上面…

Lync Server 2010迁移至Lync Server 2013部署系列 Part18:开启Lync 2013 Mobility

当我们将内部Lync 功能开通后&#xff0c;我们除了需要发布边缘开启外部登录功能外&#xff0c;我们还需要向用户提供Lync 手机登录功能&#xff0c;那么在今天的博文中我们就介绍一下关于如何开启Lync Mobility功能&#xff0c;就Lync 2013来讲&#xff0c;我个人认为开启Mobi…

使用springfox 集成swagger 与spring mvc

2019独角兽企业重金招聘Python工程师标准>>> 创建一个maven 模块 将springfox相关的配置都配置在一个单独的api模块中&#xff0c;可以把这个模块当成web应用跑起来。 <pluginRepositories> <pluginRepository> <id>jcenter-snapshots</id>…

Android之 AudioTrack学习

AudioTrack主要是用来播放声音的&#xff0c;AudioTrack贯穿了JAVA层,JNI层和Native层。 AudioTrack JAVA层&#xff1a; framework\base\media\java\android\media\AudioTrack.java 以AudioTrack的使用方法举例&#xff1a;pp] // 得到一个满足最小要求的缓冲区的大小 int b…

技术分享 | CodeReview主要Review什么?

源宝导读&#xff1a;Code Review, 意即代码审查,是指一种有意识和系统的召集其他程序员来检查彼此的代码是否有错误的地方. 在敏捷团队中推行CodeReview, 可以帮助团队快速成长.本文将分享在"天际-建模平台"如何推行&实践CodeReview。一、为什么要 Code Review?…

Oracle中的USEREVN()

1.USEREVN() 返回当前用户环境的信息,opt可以是: ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE 1.ISDBA 查看当前用户是否是DBA如果是则返回true SQL> select userenv(isdba) from dual; USEREN ------ FALSE 2.SESSION 返回会话标志 SQL>…

你尿尿的时长是不是21秒?2次登上Nature封面的他,靠研究拉尿获得“诺贝尔奖”.........

全世界只有3.14 % 的人关注了爆炸吧知识男人的快乐就是这么朴实无华为什么蚊子不会被雨滴砸死&#xff1f;这个发在知乎上会被质疑患有十年脑血栓的问题&#xff0c;获得了2015年的中国搞笑诺贝尔奖——菠萝科学奖。获奖者结束获奖感言的方式也很搞笑&#xff1a;这个直接在“诺…

SQL优化总结

SQL 的优化主要涉及几个方面&#xff1a; &#xff08;1&#xff09; 相关的统计信息缺失或者不准确 &#xff08;2&#xff09; 索引问题 &#xff08;3&#xff09; SQL 的本身的效率问题&#xff0c;比如使用绑定变量&#xff0c;批量DML 采用bulk等&#xff0c;这…