You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

依赖注入场景下如何向Fluent Validation传递数据

解决依赖注入场景下Fluent Validation传递动态数据的问题

核心思路

不要通过构造函数传递运行时动态数据(比如从API实时获取的moreData),而是利用Fluent Validation内置的ValidationContext.Items字典来传递,这样既保留依赖注入的优势,又能灵活传入动态数据。

具体实现步骤

1. 修改验证器,移除构造函数参数

调整验证器规则,通过ValidationContext获取动态数据:

public class SomeClassValidator : AbstractValidator<SomeClass>
{
    public SomeClassValidator()
    {
        RuleFor(x => x.Id)
            .Must((model, id, context) => 
            {
                // 从上下文Items中取出动态数据
                if (context.Items.TryGetValue("ApiData", out var apiDataObj) 
                    && apiDataObj is List<DataModel> apiData)
                {
                    // 编写你的验证逻辑,比如检查ID是否存在于API返回的数据中
                    return apiData.Any(d => d.Id == id);
                }
                // 无数据时的默认处理,可根据需求返回false或抛出异常
                return false;
            })
            .WithMessage("当前ID不在允许的范围内");
    }
}

2. 控制器中传递动态数据到验证上下文

在控制器方法里,创建ValidationContext并将动态数据存入Items,再执行验证:

public class SomeClassController : Controller
{
    private readonly SomeClassValidator _someClassValidator;

    public SomeClassController(SomeClassValidator someClassValidator)
    {
        _someClassValidator = someClassValidator;
    }

    public IActionResult Update(SomeClass model)
    {
        // 从API获取动态数据
        var moreData = GetSomeApiData();
        
        // 创建验证上下文并添加动态数据
        var validationContext = new ValidationContext<SomeClass>(model);
        validationContext.Items["ApiData"] = moreData;
        
        // 执行验证
        var result = _someClassValidator.Validate(validationContext);
        
        if (!result.IsValid)
        {
            // 处理验证失败逻辑
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
            }
            return BadRequest(ModelState);
        }

        // 验证通过,执行后续业务逻辑
        return Ok();
    }

    // 模拟获取API数据的方法
    private List<DataModel> GetSomeApiData()
    {
        return new List<DataModel>
        {
            new DataModel { Id = 1 },
            new DataModel { Id = 2 }
        };
    }
}

补充说明

  • 如果你的动态数据是全局/请求级别的固定数据(比如当前用户信息),可以将其注册为Scoped服务,直接注入到验证器的构造函数中,这种方式更适合数据在整个请求周期内不变的场景。
  • 绝对不要通过构造函数传递运行时动态数据,因为依赖注入容器创建的验证器实例(通常是Scoped或Singleton)无法在每次调用时重新传入不同的构造参数。

内容的提问来源于stack exchange,提问作者user1094183

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:52:35