廢話不說直接上代碼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); }