aspnetboilerplate项目中如何在应用服务内调用验证类方法并抛出异常
ABP框架应用服务按需调用校验器及异常展示实现方案
ABP框架默认会对应用服务方法的输入DTO自动执行FluentValidation校验,如果你需要手动、按需调用自定义校验逻辑,可以按照以下步骤实现:
1. 定义校验类(Validator Class)
首先引入FluentValidation相关依赖,自定义校验类继承AbstractValidator<T>,ABP会自动注册所有继承该类的校验器,无需额外手动注入。示例代码如下:
public class CreateProductDtoValidator : AbstractValidator<CreateProductDto> { public CreateProductDtoValidator() { RuleFor(p => p.Name).NotEmpty().MaximumLength(100).WithMessage("商品名称不能为空且长度不能超过100"); RuleFor(p => p.Price).GreaterThan(0).WithMessage("商品价格必须大于0"); // 其他自定义校验规则 } }
2. 应用服务中按需调用校验器
在应用服务的构造函数中注入对应类型的校验器实例,在需要校验的业务节点主动调用校验方法,校验失败时抛出ABP标准的AbpValidationException即可。示例代码如下:
public class ProductAppService : ApplicationService { private readonly IValidator<CreateProductDto> _productDtoValidator; public ProductAppService(IValidator<CreateProductDto> productDtoValidator) { _productDtoValidator = productDtoValidator; } public async Task CreateProductAsync(CreateProductDto input) { // 按需触发校验,例:仅当输入参数标记需要额外校验时才执行校验逻辑 if (input.NeedExtraValidation) { var validationResult = await _productDtoValidator.ValidateAsync(input); if (!validationResult.IsValid) { // 将校验错误信息封装为ABP标准验证异常 throw new AbpValidationException( "输入参数校验不通过", validationResult.Errors.Select(e => new ValidationError(e.PropertyName, e.ErrorMessage) ).ToList() ); } } // 后续业务逻辑执行 } }
3. 异常信息展示配置
ABP框架已经对AbpValidationException做了全局处理,无需额外开发异常拦截逻辑即可正常展示错误:
- 如果是API接口请求,会自动返回400状态码,错误信息会按框架标准格式放在响应体的
error字段中,和默认自动校验的返回格式完全一致,前端可以统一处理展示。 - 如果是MVC页面请求,错误信息会自动存入
ModelState,可以直接在页面通过@Html.ValidationSummary()渲染展示错误。
如果需要自定义展示逻辑,可在前端全局拦截响应,判断响应中存在校验错误时,统一做弹窗或者行内错误提示即可。
注意事项
- 如果你不需要关闭ABP的默认自动校验,仅补充手动校验逻辑,不需要修改全局配置;如果想要禁用某个方法的默认自动校验,可以给方法加上
[DisableValidation]特性,避免重复校验。 - 同一个校验器的规则可以复用,支持在多个应用服务、领域服务中按需注入调用。
内容的提问来源于stack exchange,提问作者Mozhgan Hatami
相关产品推荐
相关产品推荐

