9

我的 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 包的问题?

4

2 回答 2

11

看起来问题在于 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 或通过新的分叉修复引用。

更新

刚刚向 Ninject.Web.Mvc.FluentValidation发布了一个错误报告。希望这将确保问题得到快速解决。

更新 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 包自动添加了一个)。

于 2012-08-18T08:40:30.193 回答
2

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

“未来,主要的 nuget 包将不再被强烈命名。

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

于 2012-08-19T14:49:40.427 回答