使用Swagger和FluentValidation的Web API 2文档

时间:2016-08-16 04:25:38

标签: c# asp.net-web-api asp.net-web-api2 swagger fluentvalidation

我们正在使用web api 2开发web api并进行流畅的验证。一切都很好。

然而,我们意识到我们在流利验证中定义的规则并没有得到swagger(Swashbuckle)的尊重。

例如

Class Customer {
    public string Name {get;set;}
}

如果我在fluent验证器中将名称定义为必填字段,则该属性在api中标记为可选。我知道我们可以通过使用.net注释属性来完成这项工作。但我们并不想分离验证逻辑(在.net注释中,一些逻辑并不容易。

对此的任何评论都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

您可以通过向Swagger配置添加自定义SchemaFilter,将您的Fluent验证规则包含在Swagger文档中。

将以下代码添加到SwaggerConfig.cs文件中:

c.SchemaFilter<FluentValidationRules>();

使用以下代码继承ISchemaFilter

public class FluentValidationRules : ISchemaFilter
{
    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
    {
        var validator = new Customer(); //Your fluent validator class

        schema.required = new List<string>();

        var validatorDescriptor = validator.CreateDescriptor();

        foreach (var key in schema.properties.Keys)
        {
            foreach (var validatorType in validatorDescriptor.GetValidatorsForMember(key))
            {
                if (validatorType is NotEmptyValidator)
                {
                    schema.required.Add(key);
                }
            }
        }
    }
}