在业务层实现校验请求参数
前言
在前面的文章中,我們介紹了在業(yè)務(wù)層實(shí)現(xiàn)管道模式:
響應(yīng)緩存
記錄請(qǐng)求日志
今天,我們同樣使用IPipelineBehavior,介紹如何在業(yè)務(wù)層實(shí)現(xiàn)校驗(yàn)請(qǐng)求參數(shù),用于檢查輸入是否滿足業(yè)務(wù)要求。
Demo
首先,創(chuàng)建ASP.NET Core Web API項(xiàng)目,引用Nuget包:
MediatR MediatR.Extensions.Microsoft.DependencyInjection FluentValidation FluentValidation.DependencyInjectionExtensions1.實(shí)現(xiàn)IPipelineBehavior
創(chuàng)建ValidationBehaviour,用于校驗(yàn)請(qǐng)求參數(shù):
public?class?ValidationBehaviour<TRequest,?TResponse>?:?IPipelineBehavior<TRequest,?TResponse>where?TRequest?:?IRequest<TResponse> {private?readonly?IEnumerable<IValidator<TRequest>>?_validators;public?ValidationBehaviour(IEnumerable<IValidator<TRequest>>?validators){_validators?=?validators;}public?async?Task<TResponse>?Handle(TRequest?request,?CancellationToken?cancellationToken,RequestHandlerDelegate<TResponse>?next){//?如果沒(méi)有為當(dāng)前正在執(zhí)行的請(qǐng)求定義校驗(yàn)器,則退出if?(!_validators.Any())?return?await?next();//?執(zhí)行校驗(yàn)器var?context?=?new?ValidationContext<TRequest>(request);var?validationResults?=await?Task.WhenAll(_validators.Select(v?=>?v.ValidateAsync(context,?cancellationToken)));var?errors?=?validationResults.SelectMany(r?=>?r.Errors).Where(f?=>?f?!=?null).ToList();if?(!errors.Any())?return?await?next();//?返回錯(cuò)誤var?sb?=?new?StringBuilder();errors.ForEach(f?=>{sb.Append(f.ErrorMessage);});throw?new?Exception(sb.ToString());} }2.注冊(cè)IPipelineBehavior
修改Startup.cs:
services.AddValidatorsFromAssembly(typeof(Startup).Assembly);services.AddMediatR(typeof(Startup).Assembly); services.AddTransient(typeof(IPipelineBehavior<,>),?typeof(ValidationBehaviour<,>))3.測(cè)試
修改WeatherForecastController,使用Mediator:
public?class?WeatherForecastController?:?ControllerBase {private?readonly?IMediator?_mediator;public?WeatherForecastController(IMediator?mediator){this._mediator?=?mediator;}[HttpGet]public?async?Task<IEnumerable<WeatherForecast>>?Get(int?count){return?await?this._mediator.Send(new?GetWeatherForecastQuery?{?Count=?count?});} }public?class?GetWeatherForecastQuery?:?IRequest<IEnumerable<WeatherForecast>> {public?int?Count?{?get;?set;?} }internal?class?GetWeatherForecastQueryHandler?:?IRequestHandler<GetWeatherForecastQuery,?IEnumerable<WeatherForecast>> {?public?async?Task<IEnumerable<WeatherForecast>>?Handle(GetWeatherForecastQuery?request,?CancellationToken?cancellationToken){var?rng?=?new?Random();return?Enumerable.Range(1,?request.Count).Select(index?=>?new?WeatherForecast{TemperatureC?=?rng.Next(-20,?55),}).ToArray();} }并為GetWeatherForecastQuery創(chuàng)建一個(gè)Validator,校驗(yàn)Count參數(shù)的取值范圍:
public?class?GetWeatherForecastQueryValidator?:?AbstractValidator<GetWeatherForecastQuery> {public?GetWeatherForecastQueryValidator(){RuleFor(c?=>?c.Count).GreaterThanOrEqualTo(1).WithMessage("Count的取值范圍是1到5").LessThanOrEqualTo(5).WithMessage("Count的取值范圍是1到5");} }運(yùn)行程序,輸入錯(cuò)誤值,將拋出異常:
結(jié)論
在本文中,我們通過(guò)FluentValidation實(shí)現(xiàn)校驗(yàn)功能,詳細(xì)使用方式請(qǐng)參看官網(wǎng):https://fluentvalidation.net/
如果你覺(jué)得這篇文章對(duì)你有所啟發(fā),請(qǐng)關(guān)注我的個(gè)人公眾號(hào)”My IO“
總結(jié)
以上是生活随笔為你收集整理的在业务层实现校验请求参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何实现 asp.net core 安全
- 下一篇: WPF 四种不同效果呼吸灯