9

我需要能够提供IComponentContext给我ValidatorFactory解决 FluentValidation 验证器。我有点卡住了。

验证器工厂

    public class ValidatorFactory : ValidatorFactoryBase
    {
        private readonly IComponentContext context;

        public ValidatorFactory(IComponentContext context)
        {
            this.context = context;
        }

        public override IValidator CreateInstance(Type validatorType)
        {
            return context.Resolve(validatorType) as IValidator;
        }
    }

如何提供上下文并注册ValidatorFactory

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory());
4

2 回答 2

12

与其将它与 Autofac 紧密耦合,不如DependencyResolver直接使用它使其普遍适用于任何对象:

public class ModelValidatorFactory : IValidatorFactory
{
  public IValidator GetValidator(Type type)
  {
    if (type == null)
    {
      throw new ArgumentNullException("type");
    }
    return DependencyResolver.Current.GetService(typeof(IValidator<>).MakeGenericType(type)) as IValidator;
  }

  public IValidator<T> GetValidator<T>()
  {
    return DependencyResolver.Current.GetService<IValidator<T>>();
  }
}

然后,您可以将任何类型的验证器注册DependencyResolver为强类型IValidator<T>,它总是会最终解决。

于 2012-09-04T16:51:17.417 回答
0

我想通了。如果你有ValidatorFactorytake IComponentContext,Autofac 会自动注入它。

验证器工厂

    public class ValidatorFactory : ValidatorFactoryBase
    {
        private readonly IComponentContext context;

        public ValidatorFactory(IComponentContext context)
        {
            this.context = context;
        }

        public override IValidator CreateInstance(Type validatorType)
        {
            return context.Resolve(validatorType) as IValidator;
        }
    }

注册ValidatorFactory

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory());
于 2012-09-01T17:47:55.477 回答