在Asp.net Core中使用Swagger进行流利验证 [英] Fluent Validation with Swagger in Asp.net Core
问题描述
我目前在Web API中使用的是Fluent Validation
而不是Data Annotations
,并且使用swagger编写API文档.流利的验证规则未反映在swagger模型中,因为我无法使用swagger架构过滤器配置流利的验证规则.
I am currently using Fluent Validation
instead of Data Annotations
for my Web api and using swagger for API documentation. Fluent validation rules are not reflected in swagger model as i am unable to configure fluent validation rules with swagger schema filter.
此博客有一个与ASP.net MVC一起使用的很好解释.但是我无法对其进行配置以在ASP.net Core中使用它.
This Blog has a good explanation for using it with ASP.net MVC. but i am unable to configure it to use it in ASP.net Core.
到目前为止,我已经尝试了以下代码,但无法获得验证器类型.
So far i have tried the following code but i am unable to get validator type.
services.AddSwaggerGen(options => options.SchemaFilter<AddFluentValidationRules>());
public class AddFluentValidationRules : ISchemaFilter
{
public void Apply(Schema model, SchemaFilterContext context)
{
model.Required = new List<string>();
var validator = GetValidator(type); // How?
var validatorDescriptor = validator.CreateDescriptor();
foreach (var key in model.Properties.Keys)
{
foreach (var propertyValidator in validatorDescriptor.GetValidatorsForMember(key))
{
// Add to model properties as in blog
}
}
}
}
推荐答案
搜索后,我终于发现我需要IValidationFactory
作为验证器实例.
After searching i have finally figured out that i needed to IValidationFactory
for validator instance.
public class AddFluentValidationRules : ISchemaFilter
{
private readonly IValidatorFactory _factory;
/// <summary>
/// Default constructor with DI
/// </summary>
/// <param name="factory"></param>
public AddFluentValidationRules(IValidatorFactory factory)
{
_factory = factory;
}
/// <summary>
/// </summary>
/// <param name="model"></param>
/// <param name="context"></param>
public void Apply(Schema model, SchemaFilterContext context)
{
// use IoC or FluentValidatorFactory to get AbstractValidator<T> instance
var validator = _factory.GetValidator(context.SystemType);
if (validator == null) return;
if (model.Required == null)
model.Required = new List<string>();
var validatorDescriptor = validator.CreateDescriptor();
foreach (var key in model.Properties.Keys)
{
foreach (var propertyValidator in validatorDescriptor
.GetValidatorsForMember(ToPascalCase(key)))
{
if (propertyValidator is NotNullValidator
|| propertyValidator is NotEmptyValidator)
model.Required.Add(key);
if (propertyValidator is LengthValidator lengthValidator)
{
if (lengthValidator.Max > 0)
model.Properties[key].MaxLength = lengthValidator.Max;
model.Properties[key].MinLength = lengthValidator.Min;
}
if (propertyValidator is RegularExpressionValidator expressionValidator)
model.Properties[key].Pattern = expressionValidator.Expression;
// Add more validation properties here;
}
}
}
/// <summary>
/// To convert case as swagger may be using lower camel case
/// </summary>
/// <param name="inputString"></param>
/// <returns></returns>
private static string ToPascalCase(string inputString)
{
// If there are 0 or 1 characters, just return the string.
if (inputString == null) return null;
if (inputString.Length < 2) return inputString.ToUpper();
return inputString.Substring(0, 1).ToUpper() + inputString.Substring(1);
}
}
并将此类添加到swaggerGen选项
and add this class to swaggerGen options
options.SchemaFilter<AddFluentValidationRules>();
这篇关于在Asp.net Core中使用Swagger进行流利验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!