我们正在Web API中使用流畅的验证。

端点在几个地方接受具有string[]类型的属性的视图模型。

我有一个问题,每当我们使用这些端点之一时,如果字符串数组包含任何元素,流利的验证就会从验证工厂(基于DI)中请求一个IValidator<string>。因此,似乎流利的验证似乎希望将IValidator<string>用作集合验证器。

我们没有定义IValidator<string>,所以我们从DI容器中获得了一个组件未找到异常。我们也不需要为单个字符串定义验证器。

为什么非流水线验证不要求普通字符串属性,却要求IValidator<string>用于字符串集合?我可以告诉你不要吗?

最佳答案

为什么流利的验证要求IValidator进行字符串收集


没有看到您的验证配置很难说,但是我想这是因为FluentValidation试图解析存储在您的集合中的类型(在这种情况下为字符串)。

就FluentValidation和您的IoC容器而言,类型就是类型-这就是您的IoC容器尝试解析IValidator<string>实例的原因。


  我可以告诉你不要吗?


您可以通过检查Evgeny Levin(在下面复制)建议的ValidatorFactory内的类型来告诉它不要这样做。

public class ServiceLocatorValidatorFactory : ValidatorFactoryBase
{
    public override IValidator CreateInstance(Type validatorType)
    {
        if (validatorType == typeof(string))
            return null;
        ...
    }
}


另外,您可以让您的IoC容器尝试解决它,如果无法使用TryGetInstance()之类的方法(在此实例中使用StructureMap)解决依赖关系,则返回null。

public override IValidator CreateInstance(Type validatorType)
{
    return this.serviceLocator.GetInstance(validatorType) as IValidator;
}

关于c# - FluentValidation正在请求IValidator <string>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26936040/

10-11 20:01