Aspnet Core 10 Preview3已对最小API提供参数验证支持

前言

相信大家都或多或少用上了Minimal API,快速简洁,性能炸裂,是快速开发API端口的不二之选!但是呢目前正式版为止 最小API还并不内置支持对请求参数的内置验证支持,比如[Required],或者任何需要验证的地方,往往我们要实现这样的逻辑都必须自主扩展一个EndpointFilter,这个在NET社区也算是一个不大不小的槽点,不过呢MS总算是千呼万唤始出来,在NET10的第三个预览版提供了对System.ComponentModel.DataAnnotations内置验证支持!

体验

安装升级到最新释出的NET10Preview3,然后完成下面操作:

csharp 复制代码
builder.Services.AddValidation();

在项目文件(.csproj)中配置 InterceptorsNamespaces 属性以启用自动生成的拦截器。示例配置如下:

xml 复制代码
<PropertyGroup>
  <!-- 启用验证属性拦截器的生成 --> 
  <InterceptorsNamespaces>$(InterceptorsNamespaces);Microsoft.AspNetCore.Http.Validation.Generated</InterceptorsNamespaces>
</PropertyGroup>

然后源生成器就可以工作了,会自动发现验证类型 实现机制会自动查找在最小 API 处理程序中定义的类型或其基类型中所配置的验证属性,并在每个终端节点上通过添加的终端节点筛选条件执行验证。这种方式大大简化了开发者的工作量,无需手动编写验证逻辑。

比如下面的API定义:

csharp 复制代码
app.MapPost("/products",
    ([EvenNumber(ErrorMessage = "产品ID必须")] int productId, [Required] string name)
        => TypedResults.Ok(productId))

如果产品ID未传,或者name为空那么将会返回 HTTP 400 Bad Request的错误!

如果需要排除这个Endpoint的参数验证只需要添加上.DisableValidation()即可:

csharp 复制代码
app.MapPost("/products",
    ([EvenNumber(ErrorMessage = "产品ID必须")] int productId) => TypedResults.Ok(productId))
    .DisableValidation();

当然了除了内置于System.ComponentModel.DataAnnotations的验证特性之外,你完全可以扩展自己的验证特性,比如和业务相关的复杂验证情况,只需要实现IValidatableObject接口即可,也可以继承自ValidationAttribute实现一些简单的个性化验证

最后

验证支持机制使 MinimalAPI 能够在请求数据进入业务逻辑之前自动执行验证,从而提高安全性和代码维护性。同时,开发者既可以利用内置的验证功能,也可以通过自定义验证属性和接口实现来满足特定业务需求。通过这种灵活的设计,ASP.NET Core 的MinimalAPI能够在保持简洁的同时,提供强大而可靠的验证支持。

当前还属于早期预览版本,可能后续正式版本的发布还会有些许变化,前期了解即可,待正式发布再用于生产~

我们一起期待正式版的早日到来!