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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:05:09