2009-12-17 4 views
1

내 asp.net-mvc 응용 프로그램 정적 CreateContainer() 메서드를 호출하는 정적 MvcApplication 있습니다. 내가 아니라 내 소스를 이해하면이 인스턴스가 Unity에 의해 시작된 이유는 무엇입니까?

private static IUnityContainer CreateContainer() 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<IConfigurationService, ConfigFile>(); 
    container.RegisterType<ILoggerService, NlogLoggerService>(); 

    container.RegisterInstance<ISearchService>(
     new LuceneSearchService(
      container.Resolve<IConfigurationService>(), 
      container.Resolve<ILoggerService>()), 
      new ContainerControlledLifetimeManager()); 
} 

, 이것은 나에게 싱글 LuceneSearchService 인스턴스를 제공해야합니다 :이 방법에서는

나는 나의 단결 IOC 컨테이너를 만듭니다. 그러나 내 로깅에서는이 인스턴스가 요청 될 때마다 내 생성자가 히트가되는 것을 볼 수 있습니다.

내가 뭘 잘못하고 있니?

답변

4

싱글의 경우 :로

개인적으로, 나는 또한 등록 것입니다. 기본적으로 null로 설정하십시오.

그런 다음 CreateContainer 함수에서 container가 null인지 확인하십시오. 그렇다면 생성하고 초기화하십시오. 그렇지 않으면 그냥 반환하십시오.

private static IUnityContainer container = null; 
private static IUnityContainer CreateContainer() 
{ 
    if(container == null) 
    { 
     container = new UnityContainer(); 
     container.RegisterType<IConfigurationService, ConfigFile>(); 
     container.RegisterType<ILoggerService, NlogLoggerService>(); 

     container.RegisterInstance<ISearchService>(
      new LuceneSearchService(
       container.Resolve<IConfigurationService>(), 
       container.Resolve<ILoggerService>()), 
       new ContainerControlledLifetimeManager()); 
    } 

    return container; 
} 
+0

P. 나만인가, 아니면 'var'가 C#에서 가장 과용되고 오용되고 오해 된 키워드입니까? – TJMonk15

+0

+1. 그것은 "Singleton"이 아니라 "ContainerControlledLifetimeManager"입니다. OP가 매번 새로운 컨테이너를 생성하기 때문에 수명이 매우 짧습니다. UnityContainer는 IDisposable입니다. – TrueWill

+0

ASP.Net MVC 또는 Unity (MVC와 다른 점이라면?)를 사용하지 않습니다. 난 그저 싱글 톤을하는 법을 알고있다 .- P – TJMonk15

1

ISearchService을 직접 해결하고 있다고 가정한다면, 실제로는 이 아니라고 생각할 것입니다.이 경우 기존의 매핑이 없기 때문에 Unity가 매번 새로운 인스턴스를 생성 할 것이라고 생각합니다. 당신은 함수의 외부 용기의 정의를 이동하고 고정해야 container.RegisterType<ISearchService, LuceneSearchService>(new ContainerControlledLifetimeManager());

+0

내 모든 생성자는 ISearchService를 허용합니다. LuceneSearchService에 대한 언급은 없지만 로그가이를 작성하지 않습니다 ... –

+0

내 싱글 톤 유형을 인스턴스화하는 올바른 방향으로 나를 가리켜 주셔서 감사합니다. 이 질문의 대답과 함께 내가 필요한 것을 얻었습니다. –