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.
不同。缓存不是静态的。
标题说明了一切。当我这样做时:
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.
不同。缓存不是静态的。