代码之家  ›  专栏  ›  技术社区  ›  computrius

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

  •  0
  • computrius  · 技术社区  · 7 年前

    标题包罗万象。当我这样做时:

    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相同的实例还是不同的实例。

    跳到一个不可避免的问题“你为什么需要这样做?”没关系。这不是问题的重点。我有我的理由,只是想知道这件作品是如何运作的。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jan Muncinsky    7 年前

    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());
    ...
    

    缓存的作用域是内核的实例。

    myClass1是与myClass2相同的实例,还是相同的实例 不同的实例。

    不同的缓存不是静态的。

        2
  •  -2
  •   computrius    7 年前

    对于其他好奇的人:它将其存储在内核之外。您将获得两个内核的相同实例。

    编辑-我运行的测试得出以下结论:

    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");
    

    输出:相同

    再次编辑: 我一定是打字打错了,因为我再次测试,结果“不一样”。