9

FluentValidation Validators を解決するIComponentContextには、 を提供できる必要があります。ValidatorFactory私は少し立ち往生しています。

ValidatorFactory

    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 はそれを自動的に挿入します。

ValidatorFactory

    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 に答える