前言

简单整理一些配置的验证。

正文

配置的验证大概分为3类:

  1. 直接注册验证函数

  2. 实现IValidteOptions

  3. 使用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>();

结果:

![](https://img2020.cnblogs.com/blog/1289794/202106/1289794-20210606084403021-1632864116.png)

至于验证的原理。

举下面这个例子:

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种配置验证[十四]的更多相关文章

  1. 重新整理 .net core 实践篇—————服务与配置之间[十一二]

    前言 前面基本介绍了,官方对于asp .net core 设计配置和设计服务的框架的一些思路.看下服务和配置之间是如何联系的吧. 正文 服务: public interface ISelfServic ...

  2. 重新整理 .net core 实践篇————polly失败重试[三十四]

    前言 简单整理一下polly 重试. 正文 在开发程序中一般都有一个重试帮助类,那么polly同样有这个功能. polly 组件包: polly 功能包 polly.Extensions.Http 专 ...

  3. 重新整理 .net core 实践篇—————服务的配置更新[十三]

    前言 前文讲述了,服务和配置直接的配合,这一节写一下,当配置文件修改了,每个服务如何感知自己的配置. 正文 服务感知到自己的配置发生变化,这就牵扯出两个东西: IoptionsMonitor<o ...

  4. 重新整理 .net core 实践篇————依赖注入应用之援军[四]

    前言 介绍第三方依赖注入框架Autofac,看看为我们解决什么问题. 下面介绍4个点: 命名注册 属性注册 aop 注入 子容器命名 正文 为什么我们需要使用第三方框架?第三方框架为我们做了什么?第三 ...

  5. 重新整理 .net core 实践篇—————日志系统之战地记者[十五]

    前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...

  6. 重新整理 .net core 实践篇——— 权限中间件源码阅读[四十六]

    前言 前面介绍了认证中间件,下面看一下授权中间件. 正文 app.UseAuthorization(); 授权中间件是这个,前面我们提及到认证中间件并不会让整个中间件停止. 认证中间件就两个作用,我们 ...

  7. 重新整理 .net core 实践篇—————工作单元模式[二十六]

    前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...

  8. 重新整理 .net core 实践篇————配置应用[一]

    前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...

  9. 重新整理 .net core 实践篇—————配置系统之军令状[七](配置文件)

    前言 介绍一下配置系统中的配置文件,很多服务的配置都写在配置文件中,也是配置系统的大头. 正文 在asp .net core 提供了下面几种配置文件格式的读取方式. Microsoft.extensi ...

随机推荐

  1. 1028 List Sorting

    Excel can sort records according to any column. Now you are supposed to imitate this function. Input ...

  2. 【Java集合】为什么HashMap的长度是2的N次幂?

    这个问题应该倒过来思考,HashMap的长度是2的N次幂,有什么优势? 在HashMap的putVal()方法中,为了确定插入元素在table[]数组中的下标位置,使用的与(&)运算来计算 如 ...

  3. Django Ajax序列化与反序列化

    序列化与反序列是最常用的功能,有时我们需要将一个表单组打包成Json格式等然后再提交给服务端,这样可以提高效率节约带框,如下是Django配合Ajax实现的序列化与反序列化,文件上传等操作. Ajax ...

  4. 手机改 user模式为debug模式

    logcat 是Android中一个命令行工具,可用于监控手机应用程序的log信息.网上相关的教学很多,这里只想把自己折腾 2 部手机(一个是三星S4 I9500 港水,Android 5.01,一个 ...

  5. SMTP、POP3和IMAP邮件协议

    目录 SMTP POP IMAP 总结 DNS记录中的MX记录 今天入职第一天,公司让配置个人的内网.外网邮箱,这可把我给搞晕了,本来以前就对邮箱这块不是很了解,平时也不怎么用邮箱,顶多有个QQ邮箱而 ...

  6. 9.PHP文件处理

    PHP文件系统 (当成是扩展C++来看就行了,几乎一样): 读取整个文件readfile() .file(). file_get_contents() <?php    readfile('fi ...

  7. Windows核心编程 第九章 线程与内核对象的同步(上)

    第9章 线程与内核对象的同步 上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法.用户方式同步的优点是它的同步速度非常快.如果强调线程的运行速度,那么首先应该确定用户方式的线程同步 ...

  8. 神经网络与机器学习 笔记—支持向量机(SVM)(上)

    支持向量机(SVM)的主要思想: 给定训练样本,支持向量机建立一个超平面作为决策曲面,使得正例和反例之间的隔离边缘被最大化. 线性可分模式的最优超平面 训练样本{(xi,di)}^N i=1 ,其中x ...

  9. Base64文件上传(Use C#)

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法. 使用base64进行文件上传的具体流程是:前台使用js将文件转换为base64格 ...

  10. Educational Codeforces Round 101 (Rated for Div. 2)

    A. Regular Bracket Sequence 题意:题目中给(和)还有?,其中?可以转换成为()中的任何一个,并且所给样例中只出现一次(),问能不能括号匹配 思路:直接看第一个和最后一个能不 ...