【问题标题】:Error with NinjectValidatorFactory after updating FluentValidation with Nuget使用 Nuget 更新 FluentValidation 后 NinjectValidatorFactory 出错
【发布时间】:2012-08-18 03:19:21
【问题描述】:

我的 NinjectModule 中有以下代码行:

Bind<IValidatorFactory>().To<NinjectValidatorFactory>().InSingletonScope();

这曾经可以正常工作,但在使用 Nuget 进行大量更新后,我收到以下错误:

错误 3 类型“Ninject.Web.Mvc.FluentValidation.NinjectValidatorFactory”不能用作泛型类型或方法“Ninject.Syntax.IBindingToSyntax.To()”中的类型参数“TImplementation”。没有从“Ninject.Web.Mvc.FluentValidation.NinjectValidatorFactory”到“FluentValidation.IValidatorFactory”的隐式引用转换。 D:\Projects\Current...\Configuration\MainModule.cs 19 13

错误 4 类型“FluentValidation.ValidatorFactoryBase”在未引用的程序集中定义。您必须添加对程序集“FluentValidation,Version=2.0.0.0,Culture=neutral,PublicKeyToken=a82054b837897c66”的引用。 D:\Projects\Current...\Configuration\MainModule.cs 19 13

确实,我没有引用 FluentValidation Version=2.0.0.0,但我确实引用了 FluentValidation Version=3.4.0.0。

根据元数据...

  • IValidatorFactoryValidatorFactoryBase 在 Assembly FluentValidation.dll 中定义。
  • NinjectValidatorFactory 在 Assembly Ninject.Web.Mvc.FluentValidation.dll 中定义。

在我的 References 文件夹中,我有 FluentValidation v3.4.0.0 和 Ninject.Web.Mvc.FluentValidation v3.0.0.0。

我不明白为什么编译器认为我需要 FluentValidation Version=2.0.0.0。

是我做错了什么,还是 Nuget 包的问题?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 ninject fluentvalidation


    【解决方案1】:

    问题似乎在于 FluentValidation 曾经是一个签名程序集,但现在是一个未签名程序集。然而,Ninject.Web.Mvc.FluentValidation 仍然认为 FluentValidation 已签名。

    如果您在 ILSpy 中查看这两个程序集,您会注意到以下内容:

    • Ninject.Web.Mvc.FluentValidation 使用以下属性引用 FluentValidation:FluentValidation、Version=2.0.0.0、Culture=neutral、PublicKeyToken=a82054b837897c66
    • 但是,最新版本的 FluentValidation 具有不同的属性:FluentValidation、Version=3.4.0.0、Culture=neutral、PublicKeyToken=null

    请注意,PublicKeyToken 已更改为 null(无符号)。

    希望很快就能解决这个问题。同时,选项是回滚到以前的 FluentValidation 或通过新的 fork 修复引用。

    更新

    刚刚向 Ninject.Web.Mvc.FluentValidation 发布了 bug report。希望这将确保问题得到快速解决。

    更新 2

    以防万一有人错过,下面@dismissile 的评论包含一个很好的解决方案。我试了一下,效果很好。以下是更详细的细微变化:

    1. 删除所有包含“FluentValidation”的 Nuget 包。
    2. 使用 Nuget 安装 FluentValidation-Signed。
    3. 使用 Nuget 安装 FluentValidation.MVC3-Signed(或 MVC4-Signed)
    4. 使用包管理器控制台,输入以下内容:

      Install-Package Ninject.Web.Mvc.FluentValidation -IgnoreDependencies
      

    注意:我不需要手动将绑定重定向添加到我的 Web.config(尽管 Nuget 包自动添加了一个)。

    【讨论】:

    • 感谢 dan... 如果您可以将其标记为错误,那就太好了。这样它可能会得到快速修复。谢谢
    • 更新:它已经被标记为错误并关闭。我将 Jeremy Skinner 的 cmets 作为单独的答案发布。
    • Umair,问题不在于 FluentValidation,而在于 Ninject.Web.Mvc.FluentValidation。因此,我仍然向该项目添加了一个错误报告(请参阅我的更新)。
    • @DanM 我能够通过以下方式解决这个问题:安装 FluentValidation-Signed 和 FluentValidation.MVC4-Signed。安装 Ninject.MVC3。进入包管理器控制台并安装 Ninject.Web.Mvc.FluentValidation -IgnoreDependencies。然后我创建了一个从 3.2 到 3.4.6 的绑定重定向,这样 Ninject 程序集就不会再抱怨需要特定程序集了。
    • 提及绑定重定向很有用。我查看了Ninject.Web.Mvc.FluentValidation 包,其中只有一个类,其余的都是 NuGet 工具...在这种情况下,似乎值得在您的项目中创建自己的 NinjectValidatorFactory 类,因为它确实很少,不太可能需要太多改变。
    【解决方案2】:

    DanM 正确识别了该问题。 Here是项目协调员的评论

    “今后将不再对主要 nuget 包进行强命名。

    如果您绝对需要强命名,可以使用单独的包,FluentValidation-signed,但建议您使用未签名的版本。” Jeremy Skinner

    【讨论】:

    • 感谢您澄清 FluentValidation 确实已不再被强烈命名以及原因。 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多