依赖注入场景下如何向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
相关产品推荐
相关产品推荐

