如果为mvc安装nuget Ninject软件包,它将在App_Start文件夹中放置一个NinjectWebCommon.cs文件。

除了这一行,我了解此文件中99%的内容:

kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);

完整代码文件here on GitHub

在我看来,最好使用:
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => bootstrapper.Kernel);

由于静态实例已经在文件顶部定义,因此它将获得构建了所有映射的内核。

经过一番谷歌搜索后,这似乎也很常见:
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => ctx.Kernel);

样板代码是这样的背后的原因是什么?

最佳答案

的绑定(bind)

"Func<IKernel>>"

用于将IKernel的新实例注入(inject)Bootstrapper.Initialize方法。

创建新的Bootstrapper的想法是,Bootstrapper构造函数应构造一个完全初始化的IKernel实例。该新实例将用于替换IKernel的旧实例。

假设似乎是,当调用Initialize方法时,您将要完全重置Bootstrapper实例中的IKernel实例,删除在调用Initialize之前添加的所有绑定(bind)。

因此,如果您要在启动应用程序时执行其他操作而不是重置内核,则应重新解析lambda表达式中的代码,以便内核以所需的状态传递给Bootstrapper.Initialize。

我希望这是有帮助的。

09-18 17:44