【问题标题】:instantiate ValidatorFactory with unity ioc使用统一 ioc 实例化 ValidatorFactory
【发布时间】:2014-06-18 01:54:35
【问题描述】:

我在尝试将 FluentValidation 与 Unity 集成时遇到了一些麻烦。

我有一个工厂类

  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));
    }
}

这是我试图用统一注册工厂类的代码

container.RegisterType<IValidatorFactory, UnityValidatorFactory>(new ContainerControlledLifetimeManager());

但是工厂始终为空。知道我做错了什么吗?

【问题讨论】:

  • 你是如何创建/解决Payment的?
  • 它是一个web api应用程序,付款在控制器收到的请求中
  • 你的意思是Payment是控制器上的action方法的参数?您能否更新您的问题以显示这一点?

标签: c# unity-container ioc-container fluentvalidation


【解决方案1】:

我的建议是下一个。

创建所有验证器并实现下一个接口,将其命名为:IModelValidator

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));
}

//与MVC集成,这应该在你创建容器时在你的Global.asax中完成

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);         
 }

现在在您的控制器方法中,当您发布要验证的信息时,您将看到如果您将 yourField 留空,ModelState.IsValid 的值是错误的

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多