C# 使用unity ioc实例化验证器工厂
我在尝试将FluentValidation与Unity集成时遇到了一些问题 我有一个工厂班C# 使用unity ioc实例化验证器工厂,c#,unity-container,ioc-container,fluentvalidation,C#,Unity Container,Ioc Container,Fluentvalidation,我在尝试将FluentValidation与Unity集成时遇到了一些问题 我有一个工厂班 public class UnityValidatorFactory : FluentValidation.ValidatorFactoryBase { private readonly IUnityContainer _container; public UnityValidatorFactory() { _container = null; }
public class UnityValidatorFactory : FluentValidation.ValidatorFactoryBase
{
private readonly IUnityContainer _container;
public UnityValidatorFactory()
{
_container = null;
}
public UnityValidatorFactory(IUnityContainer container)
{
_container = container;
}
public override FluentValidation.IValidator CreateInstance(Type validatorType)
{
return _container.Resolve(validatorType) as FluentValidation.IValidator;
}
}
问题是它不会在数据类中实例化
public class Payment : IValidatableObject
{
private readonly IValidator _validator = new PaymentValidator();
public string paymentType { get; set; }
//etc
public Payment(IValidatorFactory validatorFactory)
{
**//ValidatorFactory is always null!**
_validator = validatorFactory.GetValidator(typeof(Payment));
}
}
这是我试图使用unity注册factory类的代码
container.RegisterType<IValidatorFactory, UnityValidatorFactory>(new ContainerControlledLifetimeManager());
container.RegisterType(新ContainerControlledLifetimeManager());
然而,工厂总是空的。知道我做错了什么吗?我的建议是下一个 创建所有验证器并实现下一个接口,命名为:imodelvalidater
public interface IModelValidator
{
}
//example of a validator class
public class MyModelValidator : AbstractValidator<MyModel>, IModelValidator
{
public MyModelValidator ()
{
CascadeMode = CascadeMode.StopOnFirstFailure;
RuleFor(x => x.yourField)
.NotNull()
.NotEmpty()
.WithMessage("You need to enter yourField");
}
}
//this is to register all your interfaces on the container
void RegisterValidators(IUnityContainer container)
{
var type = typeof(IValidator<>);
var validators = AssemblyScanner.FindValidatorsInAssemblyContaining<IModelValidator>();
validators.ForEach(validator => container.RegisterType(validator.InterfaceType, validator.ValidatorType));
}
现在,在控制器方法中,当您发布要验证的信息时,您将看到您是否将字段留空,
ModelState.IsValid
有一个假值您如何创建/解决支付
?这是一个web api应用程序,付款在控制器收到的请求中您的意思是付款是控制器上某个操作方法的参数?你能更新你的问题来说明这一点吗?
public static ConfigureFluentValidation(IUnityContainer container)
{
var fluentValidationModelValidatorProvider = new FluentValidationModelValidatorProvider(new UnityValidationFactory(container));
//disables the implicit required validator being added for both the DataAnnotationsModelProvider, as well as the FluentValidationModelValidatorProvider.
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
fluentValidationModelValidatorProvider.AddImplicitRequiredValidator = false;
//adds the new model validator provider to the list of model validator providers used by the MVC framework.
ModelValidatorProviders.Providers.Add(fluentValidationModelValidatorProvider);
}