.NET6之MiniAPI(二十):实体验证FluentValidation

为了验证api post上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net)。在asp.net mvc中,使用的是模型验证,通过在实体类上添加特性达到验证效果。

FluentValidation的原理是通过实现AbstractValidator<T>来实现对T实体类的验证,通过不同折Rule来验证T中的属性(更多验证规则 ,参见官网),见如下实现:

public class Person
{public int Id { get; set; }public string Name { get; set; }public string Tel { get; set; }public string Email { get; set; }public DateTime Birthday { get; set; }public string IDCard { get; set; }public PersonAddress Address { get; set; }
}
public class PersonAddress
{public string Country { get; set; }public string Province { get; set; }public string City { get; set; }public string County { get; set; }public string Address { get; set; }public string Postcode { get; set; }
}/// <summary>
/// Person验证
/// </summary>
public class PersonValidator : AbstractValidator<Person>
{public PersonValidator(IPersonService personService){RuleFor(p => p.Name).NotNull().NotEmpty();RuleFor(p => p.Email).NotNull().EmailAddress();RuleFor(p => p.Birthday).NotNull();RuleFor(p => p.IDCard).NotNull().NotEmpty().Length(18).When(p => (DateTime.Now > p.Birthday.AddYears(1))).WithMessage(p => $"出生日期为{p.Birthday},现在时间为{DateTime.Now},大于一岁,CardID值必填!");RuleFor(p => p.Tel).NotNull().Matches(@"^(\d{3,4}-)?\d{6,8}$|^[1]+[3,4,5,8]+\d{9}$").WithMessage("电话格式为:0000-0000000或13000000000");RuleFor(p => p.Address).NotNull();RuleFor(p => p.Address).SetValidator(new PersonAddressValidator());//通过调用外部方法来验证RuleFor(p => p.Id).Must(id => personService.IsExist(id)).WithMessage(p => $"不存在id={p.Id}的用户");}
}
/// <summary>
/// Person Address验证
/// </summary>
public class PersonAddressValidator : AbstractValidator<PersonAddress>
{public PersonAddressValidator(){RuleFor(a => a.Country).NotNull().NotEmpty();RuleFor(a => a.Province).NotNull().NotEmpty();RuleFor(a => a.City).NotNull().NotEmpty();RuleFor(a => a.County).NotNull().NotEmpty();RuleFor(a => a.Address).NotNull().NotEmpty();RuleFor(a => a.Postcode).NotNull().NotEmpty().Length(6);}
}

在mini api引入FluentValidation也很简单,可以通过注入IValidator<T>实现,也可以注放AddFluentValidation,用IValidatorFactory来获取Validator来实现验证,代码如下:

using FluentValidation;
using FluentValidation.AspNetCore;
using System.Text;var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFluentValidation();
builder.Services.AddScoped<IValidator<Person>, PersonValidator>();
builder.Services.AddScoped<IPersonService, PersonService>();
var app = builder.Build();app.MapPost("/person", async (IValidator<Person> validator, Person person) =>{var result = await validator.ValidateAsync(person);if (!result.IsValid){var errors = new StringBuilder();foreach (var valid in result.Errors){errors.AppendLine(valid.ErrorMessage);}return errors.ToString();}return "OK";});app.MapPost("/person1", async (IValidatorFactory validatorFactory, Person person) =>
{var result = await validatorFactory.GetValidator<Person>().ValidateAsync(person);if (!result.IsValid){var errors = new StringBuilder();foreach (var valid in result.Errors){errors.AppendLine(valid.ErrorMessage);}return errors.ToString();}return "OK";
});app.MapPost("/person2", async (IValidatorFactory validatorFactory, Person person) =>
{var result = await validatorFactory.GetValidator(typeof(Person)).ValidateAsync(new ValidationContext<Person>(person));if (!result.IsValid){var errors = new StringBuilder();foreach (var valid in result.Errors){errors.AppendLine(valid.ErrorMessage);}return errors.ToString();}return "OK";
});app.Run();public interface IPersonService
{public bool IsExist(int id);
}
public class PersonService : IPersonService
{public bool IsExist(int id){if (DateTime.Now.Second % 2 == 0){return false;}else{return true;}}
}

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

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

相关文章

nagios的搭建及配置----(中)

上篇文章写到了我们布置的nagios监控本机的状态&#xff0c;下面我们来看下nagios监控服务器状态的配置。至于为什么要这么配置&#xff0c;大家可以自行去百度下看看使用NRPE插件实现对remote server 进行监控&#xff0c;远程服务器配置1&#xff0c;编译安装nagios-plugin&a…

计算机整个文稿应用回顾主题,《计算机应用基础》精品课程电子教案-PowerPoint 2003...

一&#xff0e;回顾上次课内容(提问方式)对于幻灯片的切换、配色方案的使用、母版的使用用实例进行提问&#xff0c;通过学生的操作了解学生掌握的情况&#xff0c;并加强学生的实践操作能力。二、新课教学(讲解法、示范法)5.6.1幻灯片切换具体操作方法如下&#xff1a;在【幻灯…

linux之so文件、a文件、o文件的区别

1、o文件 o 就相当于windows里的obj文件 ,一个.c或.cpp文件对应一个.o文件 .o 文件是源码编译出的二进制文件。 你先得了解从源代码到可执行文件的过程。以一个简单的add函数源文件为例。 int add(int a,int b) {return a+b; } 先预处理为.i文件gcc -E add.c -o add.i 再编译为…

【F大说】Flash的那些坑

转载自F大的自言自语←_←创建控件类时&#xff0c;基类不能用源码创建控件类时&#xff0c;基类要以swc方式提供&#xff08;不能用源码&#xff09;&#xff0c;否则控件中所包含的子元件实例名将被添加到基类&#xff0c;而不是控件类中去。调用gotoAndStop会导致帧代码插队…

iNeuOS工业互联网操作系统,顺利从NetCore3.1升级到Net6的过程汇报,发布3.7版本...

目 录1..... 概述... 12..... 升级的工程... 33..... 升级的代码差异... 44..... 系统运行... 51. 概述我们团队一直在工业领域从事实时系统和业务系统的开发与集成工作&#xff0c;开发语言使用过C51/C/VB/VC/C#(Net Framework)/C#(Netcore3.1)/C#(NET6)。前几天微软发…

软件设计和设计的问题

先感概一句, 软件设计是一个不太容易的事情&#xff0c;尤其历史需要兼容新需求的问题。 软件设计 软件设计包括很多&#xff0c;软件架构&#xff0c;软件结构&#xff0c;数据库设计。 软件不是从0开始的&#xff0c;一般都会有一些支撑组件&#xff0c;尤其现在的web程序&am…

郑州升达经贸管理学院计算机科学与技术,郑州升达经贸管理学院计算机科学与技术专业2016年在福建理科高考录取最低分数线...

类似问题答案郑州升达经贸管理学院计算机科学与技术专业2016年在吉林理科高考录取最低分数线学校 地 区 专业 年份 批次 类型 分数 郑州升达经贸管理学院 吉林 计算机科学与技术 2016 二批 理科 336 学校 地 区 专业 年份 批次 类型 分数 郑州升达经贸管理学院 吉林 计算机科学…

Android之INSTALL_FAILED_UPDATE_INCOMPATIBLE(pacakge:...do not match the previously installed version)

1、问题&#xff1a; adb install -r ***.apk 出现下面错误 INSTALL_FAILED_UPDATE_INCOMPATIBLE(pacakge:...do not match the previously installed version&#xff1b;ignoring) 2、解决办法&#xff1a; 用ApkHelp工具&#xff0c;检验这2g个apk,发现签名不一样&#…

0714M

/*************************************************************************> File Name: code/2015summer/0714/M.cpp> Author: 111qqz> Email: rkz2013126.com > Created tim: 2015年07月14日 星期二 11时37分51秒******************************************…

鲜为人知的编程真相

2019独角兽企业重金招聘Python工程师标准>>> 当程序员的经历让我知道了一些关于软件编程的事情。下面的这些事情可能会让朋友们对软件开发感到惊讶&#xff1a; 一个程序员用在写程序上的时间大概占他的工作时间的10-20%&#xff0c;大部分的程序员每天大约能写出10…

如何理解 ListT和 DictionaryK,V 的扩容机制 ?

咨询区 Royi Namir为什么 List 是按照 2倍 扩容。private void EnsureCapacity(int min) {if (this._items.Length < min){int num (this._items.Length 0) ? 4 : (this._items.Length * 2);if (num < min){num min;}this.Capacity num;} }而 Dictionary<K,V>…

Android stduio之Plugin with id ‘com.android.application‘ not found解决办法

1、错误 Plugin with id com.android.application not found 2、解决办法 打开项目的build.gradle&#xff0c;看是否有buildscript&#xff5b;&#xff5d;&#xff0c;如果没有&#xff0c;加上 buildscript {repositories {mavenCentral() // or jcenter()}dependenc…

专科学会计还是计算机应用技术好,专科毕业想要学习会计专业,我专科是学计算机应用,但是毕业后家里让我学会计这门专业,具体是该怎么办呢...

技校网专门为您推荐的类似问题答案问题1&#xff1a;福建自考会计学需要考哪些专业,我是计算机专科毕业的020204 会计 (独立本科段) -http://www.fjzk.com.cn/portal/html/193/20081202000018.html--------------------------------------------------------------------------…

Android Studio之package org.junit does not exist解决办法

1、问题 运行Android studio出现下面错误 D:\*******\ExampleUnitTest.java Error:(3, 17) error: package org.junit does not exist Error:(5, 24) error: package org.junit does not exist Error:(11, 6) error: cannot find symbol class Test Error:(13, 9) error: cann…

2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml

1. 前言入门篇我们已经成功运行hello.benchmarks.yml并输出测试结果&#xff0c;本篇我们就hello.benchmarks.yml、以及运行的shell脚本详细解读下其中的含义2. 剖析hello.benchmarks.yml2.1. job在hello.benchmarks.yml中我们定义了一个新的job: server&#xff0c;并指定了仓…

计算机应用问题,计算机应用的现状与发展的问题

计算机应用的现状与发展的问题来源&#xff1a;职称阁时间&#xff1a;2018-07-27 11:59热度&#xff1a;这篇论文主要介绍的是计算机应用的现状与发展的问题的相关内容&#xff0c;本文作者就是通过对计算机的应用现状等内容做出详细的阐述与介绍&#xff0c;特推荐这篇优秀的…

GoLang学习笔记——data_type

Go语言里面&#xff0c;每个变量也都是有类别的&#xff0c;这种类别叫做数据类型(Data Type)。 Go的数据类型有两种&#xff1a;一种是语言内置的数据类型&#xff0c;另外一种是通过语言提供的自定义数据类型方法自己定义的自定义数据类型。 数值型(Number) 数值型有三种&…

(2)从实际项目谈起,基于MEF的插件框架之总体设计

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.MEF框架简介 MEF的全称是Managed Extensibility Framework&#xff08;MEF&#xff09;&#xff0c;其是.net4.0的组成部分&#xff0c;在3.5上也可以…

Object-C 类,对象,运行时,isa

今天记录一下它的底层运作。 1&#xff1a; 类Class&#xff1a; typedef struct objc_class * Class; 从Class的定义可以看出&#xff0c;它是一个 objc_class 结构类型的指针&#xff0c;objc_class又是什么呢&#xff1f; struct objc_class{struct objc…

Avalonia跨平台入门第四篇之Popup在uos下问题

上一篇简单玩耍了Popup,这不正当我洋洋自得的时候前线传来战报:你家伙做的效果在UOS下面有问题;然后直接发来一张捷报:明明在乌班图和优麒麟都没啥问题,单单就你这个UOS牛,结果发现个神奇的特效:开启神奇的特效,果然神奇:来看看最终实现的效果:最终简单的效果先这样吧;以后有时…