数据校验
July 19, 2026 · View on GitHub
AspectCore.Extensions.DataAnnotations 用拦截器在方法执行前对参数做校验,校验规则直接复用 .NET 标准的 System.ComponentModel.DataAnnotations 特性([Required]、[EmailAddress]、[StringLength] 等)。校验结果通过 IDataState 暴露给服务,由业务代码决定如何处理,而不是直接抛异常。
两个包的关系
数据校验涉及两个包,是「基础设施 + 实现」的关系:
AspectCore.Extensions.DataValidation:校验的基础设施,提供IDataValidator、IPropertyValidator、IDataState、DataValidationInterceptorAttribute等抽象与拦截器。它不提供IServiceContext的一行式注册入口。AspectCore.Extensions.DataAnnotations:基于 DataValidation 的具体实现,用System.ComponentModel.DataAnnotations做校验,并提供用户入口AddDataAnnotations(...)。
使用者一般只需安装并调用 AspectCore.Extensions.DataAnnotations;共享的拦截器 DataValidationInterceptorAttribute 虽然物理上位于 DataValidation 包,但你通过 AddDataAnnotations 启用它。
安装与启用
dotnet add package AspectCore.Extensions.DataAnnotations
在内置容器上调用 AddDataAnnotations(...):
using AspectCore.DependencyInjection;
using AspectCore.Extensions.DataAnnotations;
var services = new ServiceContext();
services.AddType<IAccountService, AccountService>();
services.AddDataAnnotations();
var resolver = services.Build();
var accountService = resolver.Resolve<IAccountService>();
AddDataAnnotations 的签名是 IServiceContext AddDataAnnotations(this IServiceContext services, params AspectPredicate[] predicates)。它会注册校验器实现,并把 DataValidationInterceptorAttribute 加入全局拦截器;传入 predicates 可限定校验的作用范围(用法同条件拦截)。
用 DataAnnotations 特性定义规则
校验规则写在参数模型上,用标准的 System.ComponentModel.DataAnnotations 特性:
using System.ComponentModel.DataAnnotations;
public class RegisterInput
{
[Required]
public string Name { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[StringLength(18, MinimumLength = 6)]
public string Password { get; set; }
}
读取校验结果:IDataState
拦截器在方法执行前完成校验,并把结果放进服务的 IDataState DataState 属性。业务方法据此判断是否通过:
using AspectCore.Extensions.DataValidation;
public class AccountService : IAccountService
{
public IDataState DataState { get; set; }
public void Register(RegisterInput input)
{
if (DataState.IsValid)
{
Console.WriteLine($"register.. name:{input.Name}, email:{input.Email}");
return;
}
foreach (var error in DataState.Errors)
{
Console.WriteLine($"error.. key:{error.Key}, message:{error.ErrorMessage}");
}
}
}
IDataState 提供两个成员:
bool IsValid— 参数是否全部通过校验。DataValidationErrorCollection Errors— 校验失败项的集合,每项带Key与ErrorMessage。
这种「校验后由业务读取 DataState」的模式,把「是否放行」的决定权留给了业务代码,而不是由框架直接中断调用。