SimpleInjector和FluentValidationFactory,我看到了:这个答案并使用SimpleInjector3.1提出了这个:publicclassCustomValidatorFactory:ValidatorFactoryBase{publicCustomValidatorFactory(ContainersiContainer){varassemblys=AppDomain.CurrentDomain.GetAssemblies().ToList();这。siContainer=siContainer;this.siContainer.Register(typeof(IValidator),程序集);}publicoverrideIValidatorCreateInstance(TypevalidatorType){//varinstances=siContainer.GetAllInstances(validatorType);var实现=((IServiceProvider)siContainer)。varvalidatorInstance=implementation!=null?(作为IValidator实现):null;返回验证器实例;然后视图模型可以像这样publicclassPerson{publicintId{get;放;}公共字符串名称{得到;放;}公共字符串电子邮件{得到;放;}公共int年龄{得到;放;}}publicclassPersonValidator:AbstractValidator{publicPersonValidator(){RuleFor(x=>x.Id).NotNull();RuleFor(x=>x.Name).Length(0,10);RuleFor(x=>x.Email).EmailAddress();RuleFor(x=>x.Age).InclusiveBetween(18,60);但是实现变量总是空的,我也试过RegisterCollection但仍然有同样的问题,看起来当验证器从AbstractValidator继承时,SimpleInjector不知道如何解析IValidator(这是实现IValidator的类)注册Fluentvalidation工厂在这样的简单注入器中:publicclassApplicationValidatorFactory:IValidatorFactory{privatereadonlyContainer_container;///工厂的构造函数。///简单注入器容器publicApplicationValidatorFactory(Containercontainer){_container=container;}///获取指定类型的验证器。publicIValidatorGetValidator(){return_container.GetInstance>();}///获取指定类型的验证器。publicIValidatorGetValidator(Typetype){varvalidator=typeof(IValidator).MakeGenericType(类型);返回(IValidator)_container.GetInstance(验证器);然后在您的CompositionRoot中为ASP.NETMVC注册它://Registerthevalidatorsandfactoryvarassemblys=AppDomain.CurrentDomain.GetAssemblies().ToList();container.Register(Lifestyle.Singleton);container.Register(typeof(IValidator),程序集);//FVFluentValidationModelValidatorProvider.Configure(provider=>{provider.ValidatorFactory=newApplicationValidatorFactory(container);provider.AddImplicitRequiredValidator=false;});FluentValidationModelValidatorProvider可以在FluentValidation.MVC集成包中找到请记住为您正在运行的MVC版本获取一个。更新您可以为没有验证器的对象注册一个空验证器,例如://////为缺少IValidator的对象添加未注册的类型解析。//////方式。internalsealedclassValidateNothingDecorator:AbstractValidator{//我什么都不做:-)}//为缺少IValidator的对象添加未注册的类型解析//这应该放在IValidator容器注册之后。RegisterConditional(typeof(IValidator),typeof(ValidateNothingDecorator),Lifestyle.Singleton,context=>!context.Handled);我想在这里分享我集成SimpleInjector和FluentValidation的经验。我的第一次尝试与@janhartmann所做的类似,实现了一个具体的ValidatorFactoryBase,它将SimpleInjector的容器作为依赖项:publicSimpleInjectorValidatorFactory(Containercontainer)=>_container=container;publicoverrideIValidatorCreateInstance(TypevalidatorType)=>(IValidator)_container.GetInstance(validatorType);}publicstaticclassCompositionRoot{publicstaticvoidRegisterDependencies(){varcontainer=newContainer();FluentValidationModelproValidatorProvider.Configure(>provider.ValidatorFactory=newSimpleInjectorValidatorFactory(container));然而,这有效,我在ASP.NETMVC项目的上下文中使用这个工厂,对于依赖于模型绑定魔法的视图,它没有注册IValidator模型,SimpleInjector抛出ActivationException并使应用程序崩溃。我的第二次尝试当然是在GetInstance周围放置一个try-catch块:publicSimpleInjectorValidatorFactory(Containercontainer)=>_container=container;publicoverrideIValidatorCreateInstanceType(Typevalid){try{objectvalidator=_container.GetInstance(validatorType);返回(IValidator)验证器;}catch(ActivationException){//FluentValidation将正确处理nullreturnnull;但是后来我对try-catch明显放弃验证器解析不满意,所以我四处寻找一个API可以使容器返回null而不是抛出异常。事实证明这是可能的,因为Container显式实现了IServiceProvider,如果没有注册类型,它将返回null。我的第三次也是最后一次尝试,因为这个验证器工厂不再依赖于SimpleInjector,所以我将它重命名为ServiceProviderValidatorFactory:publicServiceProviderValidatorFactory(IServiceProviderserviceProvider)=>_serviceProvider=serviceProvider;publicoverrideIValidatorCreateInstance(TypevalidatorType)=>(IValidator)_serviceProvider.GetService(validatorType);}publicstaticclassCompositionRoot{publicstaticvoidRegisterDependencies(){varcontainer=newContainer();provider=>provider.ValidatorFactory=newServiceProviderValidatorFactory(container));这允许验证器工厂与SimpleInjector完全分离,这是一个额外的好处。以上就是C#学习教程分享的全部内容:SimpleInjector和FluentValidationFactory。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
