绑定 Ninject Kernel ToConstant 并使用 InTransientScope 有什么意义?

What is the point to bind Ninject Kernel ToConstant and use InTransientScope?

我想将 IServiceProvider 绑定到 Ninject IKernel 实现。使用有什么意义

Bind<IKernel>().ToConstant(this).InTransientScope();

来自 Ninject sources 的绑定?

这就是 Ninject 将 IKernel 绑定到 KernelBase 实现的方式。我不明白这一点。 ToConstant 绑定类型将范围隐式设置为 Singleton。具有 ToConstant 绑定类型的 TransientScope 对我来说没有任何意义。

ToConstant 有两个主要影响:

  • ninject 在内核的整个生命周期中保持对 "constant" 的强引用
  • 作用域配置为单例作用域。

现在 ToConstant 之后对 .InTransientScope() 的调用将范围从 Singleton 改回 transient。

这有什么变化? "transient" 对象不会被 ninject 处理。对于 Singleton 个对象,如果它们是一次性的,ninject 将在内核被销毁时销毁它们。它不会为 "transient" 个对象这样做。

因此,如果内核将被绑定 .InSingletonScope(),执行 kernel.Dispose() 将导致对 kernel.Dispose() 的另一个调用 - 甚至可能是堆栈溢出。