如何用FluentValidation实现运行时类型验证与Autofac依赖注入?
用FluentValidation结合Autofac实现运行时类型验证
完全可以实现,以下是具体操作步骤和代码示例:
1. 确认Autofac注册配置
你的注册代码已经正确,它会自动扫描程序集中所有实现了IValidator<T>的验证器,并将它们注册为IValidator接口的实例,这样就能通过DI注入所有验证器的集合:
builder.RegisterAssemblyTypes(_assemblies) .AsClosedTypesOf(typeof(IValidator<>)) .As<IValidator>();
2. 实现运行时类型验证逻辑
核心是利用非泛型的ValidationContext(它支持直接传入object类型实例,无需编译时确定类型),结合CanValidateInstancesOfType筛选验证器,完成验证:
public class MyValidationService { private readonly IEnumerable<IValidator> _validators; public MyValidationService(IEnumerable<IValidator> validators) { _validators = validators; } public bool IsTypeValid(Type typeOfInstance, object instance) { // 筛选出能处理目标类型的验证器 var applicableValidators = _validators .Where(v => v.CanValidateInstancesOfType(typeOfInstance)) .ToList(); // 无对应验证器时,可根据业务需求返回true或false if (!applicableValidators.Any()) return true; // 创建适配运行时类型的验证上下文 var validationContext = new ValidationContext(instance); // 逐个执行验证,只要有一个验证失败就返回false foreach (var validator in applicableValidators) { var validationResult = validator.Validate(validationContext); if (!validationResult.IsValid) { // 可选:记录validationResult.Errors中的错误信息 return false; } } return true; } }
关键说明
ValidationContext的非泛型构造函数直接接收object实例,完美适配运行时类型场景,解决你提到的泛型瓶颈问题。CanValidateInstancesOfType会自动匹配目标类型的验证器,包括继承关系(比如基类的验证器也会作用于子类实例)。- 如果需要验证特定规则集,可以在创建
ValidationContext时指定规则集选择器,示例:var validationContext = new ValidationContext( instance, propertyChain: null, validatorSelector: new RulesetValidatorSelector("CustomRuleset") );
内容的提问来源于stack exchange,提问作者void.pointer
相关产品推荐
相关产品推荐

