前言
相信大家都或多或少用上了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能够在保持简洁的同时,提供强大而可靠的验证支持。
当前还属于早期预览版本,可能后续正式版本的发布还会有些许变化,前期了解即可,待正式发布再用于生产~
我们一起期待正式版的早日到来!