fluentValidation集成到autofac


廢話不說直接上代碼

// 首先實現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的好處

//如果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);
            }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM