【问题标题】:Conversion of V2 Ninject Binding to V3V2 Ninject Binding 到 V3 的转换
【发布时间】:2012-06-15 11:18:55
【问题描述】:

我已经为此苦恼了大约 8 个小时,但我似乎无法找到一个简单的解释来说明如何更改我的 ninject 的自定义引导程序(上次在 v2.x.x.x 中处理代码) 到新的 v3.0.0.0 语法。

我目前有以下:

public class NinjectCustomBootStrapper : NinjectNancyBootstrapper
{
  protected override Ninject.IKernel GetApplicationContainer()
  {
    return Program.MyContainer;
  }

}

在一个单独的班级中,并且:

public static IKernel MyContainer
{
  get { return _myContainer ?? (_myContainer = CreateKernel()); }
  set { _myContainer = value; }
}

private static IKernel CreateKernel()
{
  var kernel = new StandardKernel();
  kernel.Bind<CardMonitorService>().ToSelf().InSingletonScope();
  return kernel;
}

在命令行应用程序中的主程序“Program.c”中。

自从将 ninject 更新到 V3.0.0.0 后,我才发现有一些重大变化。我承认我不经常使用ninject(我通常使用structuremap),这个项目使用的唯一原因是我最初没有编写它。

自从我升级了 Ninject 后,现在启动应用程序时出现以下异常:

Method not found: 'Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax`1<!0>
Ninject.Syntax.IBindingToSyntax`1.ToConstant(!0)'.

经过大量搜索和研究,我能找到的最接近的是:

http://sharpfellows.com/post/Ninject-Auto-registration-is-changing-in-version-3.aspx

虽然它为我指明了正确的方向,但仍然不是一个很好的解决方案,因为我没有使用自定义绑定生成器。

所以我的问题是这样的。

我如何重写上面的内容,以便我的项目再次工作,并且 WCF 服务在被调用时会在请求进入时获得正确的单例绑定。返回 ninject 2 不是一种选择,因为其他依赖项已添加的项目已强制进行 v3 升级,这些添加了已请求的新功能,因此我正在研究它。

作为参考,这是一个 .NET4 构建,在 NancyFX 上运行,具有自托管 WCF 设置作为 Windows 服务,使用 Topshelf 提供 SCM 接口。

干杯

肖蒂

补充说明

这是一个现有项目,最初是在某个时候编写的,我被要求为该项目添加一些新功能。

作为添加这些新功能的一部分,我需要将正在使用的 Ninject 版本从早期版本升级到 V3.0.0.0,因为添加到项目中的新依赖项需要更新版本的 Ninject。

在之前的 Ninject V2 下,我上面给出的代码运行良好,没有任何问题,因为项目添加了 Ninject V3,所以我现在得到了如上所述的异常。

我无法返回到早期版本的 Ninject,因为这意味着无法添加我正在添加的新功能。

根据我迄今为止所做的研究,上面的Sharpfellows链接是迄今为止我在互联网上找到的最接近我的问题的解释。

我不经常使用 Ninject,所以我不知道 V2 和 V3 之间发生了什么变化(根据我的研究)是我的问题的原因。

我需要知道如何更改我在 V2 下编写的代码(如上所示),以便它在 V3 下工作。

【问题讨论】:

    标签: ninject ninject-2


    【解决方案1】:

    MissingMethodException 通常是部署问题。您针对与部署不同的程序集进行编译。检查您是否部署了相同的版本和相同的构建。

    【讨论】:

    • 不确定我是否关注你 Remo。我在构建时遇到了这个异常。也就是说,在我的项目中,我编译、构建然后运行,应用程序立即中止并出现异常。只是为了澄清这里没有部署,所有这些都发生在任何部署之前。
    • 那我没听懂你的问题。我从“当应用程序启动时出现以下异常”了解到这是一个运行时异常。
    • 然后你必须添加给你编译错误的行。在您的问题中,我没有看到任何与 ToConstructor() 相关的内容。
    • 再一次,您不需要更改您的代码,而是您的部署!您使用的所有库(包括 Nancy.Bootstrappers.Ninject!)都需要针对 Ninject 3.0 进行编译!
    • 好的,如果是这样的话,我的代码应该可以在 V3 下运行,那太好了,我很高兴。如果是部署问题,那么我肯定不是唯一一个有问题的人,我对 NuGet 进行了更新,所以我使用的所有软件包都是最新版本,你知道还有其他投诉吗?你能确认你管上最新的 Ninject 包是否是最新的并且兼容吗?
    【解决方案2】:

    所以大约一周后,问题在于 Nancy 开发团队打破了与最新版本 ninject 的二进制可比性(反之亦然):-)

    有一个 GitHub 拉取请求来解决这个问题:

    https://github.com/NancyFx/Nancy.Bootstrappers.Ninject/pull/6

    但是下一个版本 'Nancy.Bootstrapper.Ninject' 0.12 将很快在 NuGet 上推出,这将实施修复。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2021-09-22
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多