fluentValidation集成到autofac

廢話不說直接上代碼asp.net

// 首先實現ValidatorFactory

   public class DependencyResolverValidatorFactory : ValidatorFactoryBase
    {
        public override IValidator CreateInstance(Type validatorType)
        { 
            return DependencyResolver.Current.GetService(validatorType) as IValidator;
        }
    }

 

//配置FluentValidation 
  public class FluentValidationConfig
    {
        public static void ConfigureContainer()
        {
            var factory = new DependencyResolverValidatorFactory();
            ModelValidatorProviders.Providers
                .Add(new FluentValidationModelValidatorProvider(factory)); 
            DataAnnotationsModelValidatorProvider
                .AddImplicitRequiredAttributeForValueTypes = false;
            ValidatorOptions.ResourceProviderType = typeof(ValidationResources);
            ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure; 
        }
    }
//在autofac中註冊繼承自AbstractValidator的驗證類

           AssemblyScanner
                .FindValidatorsInAssemblyContaining<AddressValidator>()
               .ForEach(x => builder.RegisterType(x.ValidatorType).As(x.InterfaceType).SingleInstance());
               
    //該類所在程序集內的全部繼承自AbstractValidator的驗證類都會被註冊到autofac容器內
    public class AddressValidator : AbstractValidator<Address>
    {
        public AddressValidator ()
        {
            RuleFor(x => x.Name).NotEmpty().WithLocalizedName(()=>"收件人");
            RuleFor(x => x.Email).NotEmpty().EmailAddress();
            RuleFor(x => x.Mobile).NotEmpty().Mobile();
        }
    }

fluentValidation集成到autofac的好處ide

//若是fluentValidation不使用autofac容器,那麼須要在每一個asp.net mv action中調用
Address address = new Address();
AddressValidator validator = new AddressValidator(); 
ValidationResult results = validator.Validate(address);

//或者

[Validator(typeof(AddressValidator))]//此行是重點
    public class Address
    {
        public string Name { get; set; }
        public string Mobile { get; set; }
        public string Email { get; set; }
        public string Details { get; set; }
    }
//用了autofac 上面兩種都不須要,在action像沒有用到fluentvalidation那樣直接:
      if (!ModelState.IsValid)
            {
                return View(model);
            }
相關文章
相關標籤/搜索