ninject 中的单例实例存储在哪里?

Where is a singleton instance stored in ninject?

标题说明了一切。当我这样做时:

var kernel = new StandardKernel();
kernel.Bind<IMyClass>().To<MyClass>().InSingletonScope();
var myClass = kernel.Get<IMyClass>();

MyClass 的实例存储在哪里?它是否存储在全球某个地方的静态字典中?还是存储在内核实例中?

例如,如果我这样做:

var kernel1 = new StandardKernel();
var kernel2 = new StandardKernel();
kernel1.Bind<IMyClass>().To<MyClass>().InSingletonScope();
kernel2.Bind<IMyClass>().To<MyClass>().InSingletonScope();
var myClass1 = kernel1.Get<IMyClass>();
var myClass2 = kernel2.Get<IMyClass>();

myClass1 与 myClass2 是同一个实例还是不同的实例。

跳到一个不可避免的问题"Why do you need to do that?":没关系。这不是问题的重点。我有我的理由,只是想知道这件作品是如何运作的。

对于其他想知道的人:它将它存储在内核之外。您将获得具有两个内核的相同实例。

编辑-测试我运行得出这个结论:

var kernel1 = new StandardKernel();
var kernel2 = new StandardKernel();
kernel1.Bind<IMyClass>().To<MyClass>().InSingletonScope();
kernel2.Bind<IMyClass>().To<MyClass>().InSingletonScope();
var myClass1 = kernel1.Get<IMyClass>();
var myClass2 = kernel2.Get<IMyClass>();
var same = myClass1 == myClass2;
Console.WriteLine(same ? "Same" : "Different");

输出:相同

再次编辑: 我一定是打错了,因为我再次测试并得到 "Different".

所以 Ninject 将它们存储在这里:

  /// <summary>Tracks instances for re-use in certain scopes.</summary>
  public class Cache : NinjectComponent, ICache, INinjectComponent, IDisposable, IPruneable
  {
    /// <summary>
    /// Contains all cached instances.
    /// This is a dictionary of scopes to a multimap for bindings to cache entries.
    /// </summary>
    private readonly IDictionary<object, Multimap<IBindingConfiguration, Cache.CacheEntry>> entries = (IDictionary<object, Multimap<IBindingConfiguration, Cache.CacheEntry>>) new Dictionary<object, Multimap<IBindingConfiguration, Cache.CacheEntry>>((IEqualityComparer<object>) new WeakReferenceEqualityComparer());
...

并且缓存的范围是内核实例。

Will myClass1 be the same instance as myClass2 or will they be different instances.

不同。缓存不是静态的。