重新整理 .net core 实践篇—————3种配置验证[十四]
前言
简单整理一些配置的验证。
正文
配置的验证大概分为3类:
直接注册验证函数
实现IValidteOptions
使用Microsoft.Extensions.Options.DataAnnotations
直接注册验证函数
服务:
public class SelfService : ISelfService
{
IOptionsMonitor<SelfServiceOption> _options;
public SelfService(IOptionsMonitor<SelfServiceOption> options)
{
this._options = options;
_options.OnChange((selftServiceOptions) =>
{
Console.WriteLine("alter change:" + selftServiceOptions.Name);
});
}
public string ShowOptionName()
{
return _options.CurrentValue.Name;
}
}
注册:
services.Configure<SelfServiceOption>(Configuration.GetSection("SelfService"), BinderOptions =>
{
BinderOptions.BindNonPublicProperties = true;
});
services.AddSingleton<ISelfService, SelfService>();
services.AddOptions<SelfServiceOption>().Validate(options =>
{
return options.Name != "zhangsan";
});
配置:
{
"SelfService": {
"name": "zhangsan"
}
}
测试:
[HttpGet]
public int GetService([FromServices]ISelfService selfService)
{
Console.WriteLine(selfService.ShowOptionName());
return 1;
}
结果:

使用Microsoft.Extensions.Options.DataAnnotations
services.AddOptions().ValidateDataAnnotations();
加上这个函数ValidateDataAnnotations。
然后我们的配置类上加一些属性之类的:
public class SelfServiceOption
{
[Required]
[StringLength(5)]
public string Name { get; set; }
}
因为zhangsan 这个字符超过了5。
结果:

实现IValidteOptions
书写验证函数:
public class SelfServiceValidateOptions : IValidateOptions<SelfServiceOption>
{
public ValidateOptionsResult Validate(string name, SelfServiceOption options)
{
if (options.Name.Length >5)
{
return ValidateOptionsResult.Fail("Name长度不能大于5");
}
else
{
return ValidateOptionsResult.Success;
}
}
}
注册进去:
services.AddSingleton<IValidateOptions,SelfServiceValidateOptions>();
结果:

至于验证的原理。
举下面这个例子:
services.AddOptions<SelfServiceOption>().Validate(options =>
{
return options.Name != "zhangsan";
});
查看Validate:
public virtual OptionsBuilder<TOptions> Validate(Func<TOptions, bool> validation)
{
return this.Validate(validation, "A validation error has occured.");
}
public virtual OptionsBuilder<TOptions> Validate(
Func<TOptions, bool> validation,
string failureMessage)
{
if (validation == null)
throw new ArgumentNullException(nameof (validation));
this.Services.AddSingleton<IValidateOptions<TOptions>>((IValidateOptions<TOptions>) new ValidateOptions<TOptions>(this.Name, validation, failureMessage));
return this;
}
就十二中也介绍了,在OptionFactory Create的函数中:
//这是_validations的类型
private readonly IEnumerable<IValidateOptions<TOptions>> _validations;
//下面是Create 函数部分:
if (_validations != null)
{
var failures = new List<string>();
foreach (var validate in _validations)
{
var result = validate.Validate(name, options);
if (result.Failed)
{
failures.AddRange(result.Failures);
}
}
if (failures.Count > 0)
{
throw new OptionsValidationException(name, typeof(TOptions), failures);
}
}
会把我们的验证全部验证运行一遍,然后给出全部的错误,所以如果报错的时候,应该把错误看齐,不是只显示一个错误,因为可能不止一个错误。
结
以上只是个人整理,如有错误,望请指点。
下一节,日志系统之战地记者
重新整理 .net core 实践篇—————3种配置验证[十四]的更多相关文章
- 重新整理 .net core 实践篇—————服务与配置之间[十一二]
前言 前面基本介绍了,官方对于asp .net core 设计配置和设计服务的框架的一些思路.看下服务和配置之间是如何联系的吧. 正文 服务: public interface ISelfServic ...
- 重新整理 .net core 实践篇————polly失败重试[三十四]
前言 简单整理一下polly 重试. 正文 在开发程序中一般都有一个重试帮助类,那么polly同样有这个功能. polly 组件包: polly 功能包 polly.Extensions.Http 专 ...
- 重新整理 .net core 实践篇—————服务的配置更新[十三]
前言 前文讲述了,服务和配置直接的配合,这一节写一下,当配置文件修改了,每个服务如何感知自己的配置. 正文 服务感知到自己的配置发生变化,这就牵扯出两个东西: IoptionsMonitor<o ...
- 重新整理 .net core 实践篇————依赖注入应用之援军[四]
前言 介绍第三方依赖注入框架Autofac,看看为我们解决什么问题. 下面介绍4个点: 命名注册 属性注册 aop 注入 子容器命名 正文 为什么我们需要使用第三方框架?第三方框架为我们做了什么?第三 ...
- 重新整理 .net core 实践篇—————日志系统之战地记者[十五]
前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...
- 重新整理 .net core 实践篇——— 权限中间件源码阅读[四十六]
前言 前面介绍了认证中间件,下面看一下授权中间件. 正文 app.UseAuthorization(); 授权中间件是这个,前面我们提及到认证中间件并不会让整个中间件停止. 认证中间件就两个作用,我们 ...
- 重新整理 .net core 实践篇—————工作单元模式[二十六]
前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...
- 重新整理 .net core 实践篇————配置应用[一]
前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...
- 重新整理 .net core 实践篇—————配置系统之军令状[七](配置文件)
前言 介绍一下配置系统中的配置文件,很多服务的配置都写在配置文件中,也是配置系统的大头. 正文 在asp .net core 提供了下面几种配置文件格式的读取方式. Microsoft.extensi ...
随机推荐
- Vue.js入门及其常用指令
一.Vue框架 https://cn.vuejs.org/ 官网 前端领域有三大框架 Angular诞生于2009年,是由谷歌公司创建出来的框架: React诞生于2013年,是由facebook公司 ...
- 07- Linux常用命令
cat命令 作用:将文件内容作为标准输出打印到终端. 格式:cat 文件名1 文件名2 例如: cat more命令: 作用:分页显示文本文件的内容 格式:more 文件名 实例:more he ...
- CentOS7用yum安装软件提示 cannot find a valid baseurl for repobase7x86_64
解决办法[亲测有效] 1.打开 vi /etc/sysconfig/network-scripts/ifcfg-enp4s0(每个机子都可能不一样,但格式会是"ifcfg-e..." ...
- vue2整个项目中,数据请求显示loading图----------未完成阅读,码
一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...
- PAT 乙级 -- 1010 -- 一元多项式求导
题目简述 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出 ...
- POJ2431贪心(最少加油次数)
题意: 给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个 ...
- picpick截屏软件脱壳
0x01 准备 OD 基本查壳软件 picpick可执行文件(不是快捷方式) 0x02 查壳 软件是2018年9月,还是比较新的 显示EP区段是.vmp1,没见过,不知道是压缩壳还是加密壳,搜索所示y ...
- (邹博ML)凸优化
目录 凸集的基本概念 凸函数的基本概念 凸优化的一般提法 凸集基本概念 思考两个不能式 两个正数的算术平均数大于等于几何平均数 给定可逆对称阵Q,对于任意向量x,y,有: 思考凸集和凸函数 在机器学习 ...
- dependencyManagement 版本管理
帮别人解决bug的时候碰到,随便记录一下. 使用<dependencyManagement>标签, 做版本管理的时候,需要父子项目关联,就需要子模块中利用<parent> 否则 ...
- Git解决中文乱码问题
git status 乱码 解决方法: git config --global core.quotepath false git commit 乱码 解决方法: git config --global ...