2017-11-15 5 views
0

Der Titel hat alles. Wenn ich dies tue:Wo ist eine Singleton-Instanz in Ninject gespeichert?

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

Wo ist die Instanz von MyClass gespeichert? Wird es irgendwo in einem statischen Wörterbuch gespeichert? Oder ist es in der Kernel-Instanz gespeichert?

Zum Beispiel, wenn ich dies tun:

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

Will MyClass1 dieselbe Instanz wie MyClass2 sein oder werden sie verschiedene Instanzen sein.

Um irgendwie auf eine unvermeidliche Frage zu springen "Warum musst du das tun?": Es spielt keine Rolle. Das ist nicht der Punkt der Frage. Ich habe meine Gründe und möchte nur wissen, wie dieses Stück funktioniert.

Antwort

2

So Ninject speichert sie hier:

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

und Cache auf Instanz eines Kernel-scoped.

Wird myClass1 die gleiche Instanz wie myClass2 sein oder werden sie unterschiedliche Instanzen sein.

Unterschiedlich. Cache ist nicht statisch.

+0

Ich habe einige Tests auf den Vorschlag von juharr (siehe Kommentar in Originalfrage) durchgeführt, und diese Tests zeigen unterschiedliche. Ich habe den gleichen Code wie oben in meiner Frage verwendet und dann einen Test durchgeführt, um zu sehen, ob "myClass1 == myClass2".Sie waren in der Tat die gleiche Instanz. – computrius

+2

@computrius Ich habe den gleichen Test ausgeführt und zwei verschiedene Instanzen erhalten, was das erwartete Verhalten ist. Beachten Sie, dass der oben angegebene Code von Ninject-Quellen stammt https://github.com/ninject/Ninject/blob/5a40fd013ab39b8118ab4c413e5c2ab9414729e9/src/Ninject/Activation/Caching/Cache.cs#L41 – jbl

+1

@computrius Wahrscheinlich war Ihr Testcode fehlerhaft. Mögliches Problem: Überschreiben die Typen die Equals-Methode? Verschiedene Kernel-Instanzen erstellen verschiedene Singleton-Instanzen. – BatteryBackupUnit

-2

Für andere, die sich wundern: Es speichert es außerhalb des Kernels. Sie erhalten dieselbe Instanz mit beiden Kernen.

Bearbeiten - Test I lief zu diesem Schluss zu kommen:

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

Ausgang: Same

Erneut bearbeiten: Ich muss einen Tippfehler gehabt haben, weil ich wieder getestet und bekam "Different".

+0

Ich bin mir nicht sicher, warum dies fehlgeschlagen ist, weil meine Tests zeigen, dass es tatsächlich korrekt war. Ich habe die Antwort mit dem Test bearbeitet, den ich ausgeführt habe. Es sei denn, die Diskrepanz kann mir erklärt werden, es wird die angenommene Antwort in zwei Tagen sein. – computrius

+4

Ich denke nicht, dass es dasselbe sein wird. Probieren Sie die Methode "object.ReferenceEquals" aus, um die Referenzgleichheit zu testen. Vielleicht überschreibt Ihre 'MyClass' Klasse den' == 'Operator? –

+0

Es wurde downvoted, weil es nicht wahr ist. Es gibt keinen anderen Grund, warum sie "Same" zurückgeben sollte, abgesehen von dem, was Yacoub bereits erwähnt hat. –

Verwandte Themen