3

我已经为此苦苦思考了大约 8 个小时,但我似乎无法找到一个简单的解释来说明如何将我的 ninject 的自定义引导程序(最后在 v2.xxx 中的代码上工作)更改为新的 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(我通常使用结构映射),而这个项目这样做的唯一原因是我最初没有编写它。

由于我已经升级了 Ninject,现在启动应用程序时出现以下异常:

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

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

http://sharpfellows.com/post/Ninject-Auto-registration-is-chang-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 下工作。

4

2 回答 2

2

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

于 2012-06-15T13:20:19.267 回答
1

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

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

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

然而,下一个版本 'Nancy.Bootstrapper.Ninject' 0.12 将很快出现在 NuGet 上,它将实施修复。

于 2012-06-20T10:31:25.403 回答