[英]Autofac: DependencyResolutionException FluentValidation.IValidator
[英]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.