簡體   English   中英

FluentValidation 正在請求 IValidator<string>

[英]FluentValidation is requesting an IValidator<string>

我們在 Web API 中使用流暢的驗證。

有幾個地方端點接受具有string[]類型屬性的視圖模型。

我有一個問題,每當我們使用這些端點之一時,如果字符串數組包含任何元素,流暢的驗證IValidator<string>從驗證工廠(基於 DI)請求IValidator<string> 所以看起來流暢的驗證似乎想要一個IValidator<string>用作集合驗證器。

我們還沒有定義IValidator<string>所以我們從 DI 容器中得到一個未找到組件的異常。 我們也不希望為單個字符串定義驗證器。

為什么 fluent 驗證請求IValidator<string>用於字符串集合,而不是用於普通字符串屬性? 我可以告訴它不要嗎?

為什么 fluent 驗證會為字符串集合請求 IValidator

如果沒有看到您的驗證配置,很難說,但我想這是因為 FluentValidation 正在嘗試解析存儲在您的集合中的類型(在本例中為字符串)。

就 FluentValidation 和您的 IoC 容器而言,類型是一種類型 - 這就是您的 IoC 容器試圖解析IValidator<string>實例的IValidator<string>

我可以告訴它不要嗎?

您可以按照 Evgeny Levin 的建議(復制如下)通過預先檢查 ValidatorFactory 中的類型來告訴它不要這樣做。

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

或者,您可以讓您的 IoC 容器嘗試解析它,如果無法使用TryGetInstance()類的方法解析依賴TryGetInstance()在此實例中使用 StructureMap TryGetInstance() ,則返回 null

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

這是我針對請求尚未在 IoC 容器中注冊的驗證器的問題的解決方案:

public class ServiceLocatorValidatorFactory : ValidatorFactoryBase
{
    public override IValidator CreateInstance(Type validatorType)
    {
        // to improve perfomance, you can reject frequently requested type before asking IoC container
        if (validatorType == typeof(string))
            return null;

        try
        {
            return ServiceLocator.Instance.GetService(validatorType) as IValidator;
        }
        catch (Exception e)
        {
            // additionally you can write information about requested type to the log
            return null;
        }
    }
}

捕獲 IoC 異常有助於我過濾不必要的驗證器。 基本上好主意是記錄錯過的驗證器類型,以防止在忘記注冊已經存在的驗證器時花費很長時間進行調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM