2017-11-15 5 views
0

제목이 모두 있습니다. 이 작업을 수행 할 때 :싱글 톤 인스턴스가 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의 같은 인스턴스가하거나 다른 인스턴스 될 것입니다.

피할 수없는 질문에 대해 "왜해야합니까?": 중요하지 않습니다. 그것이 문제의 핵심은 아닙니다. 내 이유가 있고이 작품이 어떻게 작동하는지 알고 싶습니다.

답변

2

그래서 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와 동일한 인스턴스가되거나 다른 인스턴스가됩니다.

다릅니다. 캐시는 정적이지 않습니다.

+0

나는 juharr (원래의 질문에 대한 주석 참조)의 제안에 따라 몇 가지 테스트를 실시했으며 그 테스트는 다른 것을 나타냅니다. 내 질문에 위와 같은 코드를 사용한 다음 "myClass1 == myClass2"인지 확인하는 테스트를 수행했습니다.그들은 사실 같은 경우였습니다. – computrius

+2

@computrius 동일한 테스트를 실행하여 두 개의 다른 인스턴스를 얻었습니다. 이는 예상되는 동작입니다. 위에 게시 된 코드는 Ninject 소스에서 제공됩니다. https://github.com/ninject/Ninject/blob/5a40fd013ab39b8118ab4c413e5c2ab9414729e9/src/Ninject/Activation/Caching/Cache.cs#L41 – jbl

+1

@computrius 아마도 테스트 코드에 결함이있는 것 같습니다. 가능한 문제 : 형식이 Equals 메서드를 재정의합니까? 서로 다른 커널 인스턴스는 서로 다른 싱글 톤 인스턴스를 생성합니다. – BatteryBackupUnit

-2

궁금한 사항 : 커널 외부에 저장합니다. 두 커널을 사용하여 동일한 인스턴스를 가져옵니다.

편집 - 테스트 나는이 결론에 도달하기 위해 실행 :

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

출력 : 동일을

편집 다시 : 다시 테스트 "다른"얻었 기 때문에 나는 오타 있었음에 틀림 .

+0

왜 내 테스트에서 실제로 downvoted인지 알 수 없으므로 확실하지 않습니다. 나는 내가 달린 시험으로 대답을 편집했다. 불일치가 나에게 설명 될 수 있지 않는 한, 그것은 2 일 안에 대답이 될 것이다. – computrius

+4

나는 그것이 같을 것이라고 생각하지 않는다. 참조 equality를 테스트하려면'object.ReferenceEquals' 메서드를 사용하십시오. 아마 당신의'MyClass' 클래스가'=='연산자를 오버라이드할까요? –

+0

그것은 사실이 아니기 때문에 downvoted되었습니다. 야코프가 이미 언급 한 것과 "똑같은"것을 반환해야하는 다른 이유는 없습니다. –

관련 문제