使用Nuget更新FluentValidation后NinjectValidatorFactory出错

dev*_*xer 9 asp.net-mvc ninject fluentvalidation asp.net-mvc-3

我的NinjectModule中有以下代码行:

Bind<IValidatorFactory>().To<NinjectValidatorFactory>().InSingletonScope();
Run Code Online (Sandbox Code Playgroud)

这曾经工作正常,但在使用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包的问题?

dev*_*xer 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或通过新的fork修复引用.

更新

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

更新2

万一有人错过了,下面@dismissile的评论包含一个很好的解决方案.我试一试,它几乎可以工作.这里有一个细微的变化,更详细:

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

    Install-Package Ninject.Web.Mvc.FluentValidation -IgnoreDependencies
    
    Run Code Online (Sandbox Code Playgroud)

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

  • @DanM我能够解决这个问题,执行以下操作:安装FluentValidation-Signed和FluentValidation.MVC4-Signed.安装Ninject.MVC3.进入包管理器控制台并安装Ninject.Web.Mvc.FluentValidation -IgnoreDependencies.然后我创建了从3.2到3.4.6的绑定重定向,以便Ninject程序集不再抱怨需要特定的程序集. (3认同)