无法将 Ninject 升级到 Nuget 中的最新版本

Cannot upgrade Ninject to latest version in Nuget

我有一个 ASP.NET WebForms 应用程序,它使用了一些 Ninject 包,但我卡在了某个版本。当我尝试升级到最新版本时,出现 "Unable to resolve dependencies" 个问题。

有问题的包是:

Package                       InstalledVer   LatestVer
------------------------------------------------------
Ninject                       v3.2.2         v3.3.4
Ninject.Web                   v3.2.1 ✔      v3.2.1
Ninject.Web.Common            v3.2.3         v3.3.1
Ninject.Web.Common.WebHost    v3.2.3         v3.3.1

如果我尝试更新 Ninject,我得到:

Unable to resolve dependencies. 'Ninject 3.3.4' is not compatible with 'Ninject.Web 3.2.1 constraint: Ninject (>= 3.2.0 && < 3.3.0)'

但是Ninject.Web已经是最新版本了!

我应该更改 Ninject.Web 的依赖行为吗?这样会不安全吗?如果我这样做,我应该将依赖行为更改为什么?

谢谢

好的,这就是解决方法:

  1. 完全删除 Ninject.Web 包。不再需要此软件包,因为它现在已集成到 Ninject.Web.Common(无论如何,版本 v3.3+)
  2. 更新软件包 NinjectNinject.Web.CommonNinject.Web.Common.WebHost。这些现在应该可以升级了。对我来说,它们都是 v3.3.1.
  3. 作为软件包升级的一部分,将添加一个新文件 App_Start\Ninject.Web.Common.cs。这只是对现有 App_Start\NinjectWeb.Common.cs 的重命名,因此 [a] 删除新文件或 [b] 迁移您的 Ninject 模块注册并删除旧文件。
  4. web.config 中,您现在应该删除 OnePerRequestModule 模块:

     <system.webServer>
         <modules runAllManagedModulesForAllRequests="true">
             <add name="OnePerRequestModule" type="Ninject.Web.Common.OnePerRequestHttpModule" />
         </modules>
     </system.webServer>
    

    这是因为此模块是在 App_Start\Ninject.Web.Common.cs 文件的 Start() 方法中加载时动态注册的:

    public static void Start()
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }
    

    如果您不从 web.config 中删除此条目,那么您可能会在启动应用程序时遇到类型异常,尤其是因为作为版本更新的一部分,class 已从Ninject.Web.Common 命名空间到 Ninject.Web.Common.WebHost.

  5. 同样的原因也可以删除文件App_Start\NinjectWeb.cs(注册NinjectHttpModule)

  6. 如果 OnePerRequestHttpModuleApp_Start\Ninject.Web.Common.cs 中未解析,则将以下 using 语句添加到文件 using Ninject.Web.Common.WebHost;(我认为这是 v3 中缺少的引用.3.1 包.

希望这对其他人有帮助。