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