2013-05-24 4 views
5

명명 된 인스턴스를 사용하여 동일한 인터페이스에 5 개의 파생 클래스를 등록했습니다. 이러한 클래스는 모두 싱글 톤으로 등록됩니다.여러 인스턴스를 반환하는 Singleton의 구조 맵

For<IBaseInterface>().Singleton().Use<DerivedClass1>().Named("Derived1"); 
For<IBaseInterface>().Singleton().Use<DerivedClass2>().Named("Derived2"); 
For<IBaseInterface>().Singleton().Use<DerivedClass3>().Named("Derived3"); 

입력을 기준으로 인스턴스를 확인하는 정적 클래스가 있습니다. 그러나 ObjectFactory.GetInstance를 호출 할 때마다 Singleton 대신 모든 요청에서 새 인스턴스를 반환한다는 사실을 확인했습니다. 응용 프로그램에는 스레드가 없습니다.

왜 그런지 알고 싶습니다.

편집 :

정적 해결 도우미로 인해 문제가 발생합니까? 이것은 인스턴스를 해결하는 방법입니다. 싱글 톤은 샘플 애플리케이션에서 제대로 작동하지만 내 컴퓨터에서는 작동하지 않습니다.

자세한 내용을 추가하려면 프로젝트가 MVC 웹 API이고 로컬 IIS에서 테스트 중입니다. 나는 사용자가 응용 프로그램에서 만든 스레드가 없다는 긍정적입니다.

public static class Resolver 
{ 
    public static IBaseInterface GetHelper(string inputParam) 
    { 
     if inputParam is "Case1" 
      return ObjectFactory.GetInstance<IBaseInterface>("Derived1") 
     //Similarly for other instances 
    } 
} 
+1

결과를 반복 할 수 없습니다. 나는 당신의 등록을 수행하고'GetInstance'와'GetNamedInstance'로 시도했습니다. 'GetInstance'는 매번 마지막으로 등록 된 인스턴스를 반환합니다. 'GetNamedInstance ("Derived1")'매번 'DerivedClass1'의 동일한 인스턴스를 반환합니다. – PHeiberg

+0

예, 문제를 재현하는 예제를 게시하십시오. – neontapir

+0

PHeiberg 및 neontapir 님, 간단한 코드 샘플을 만들려고했는데 제대로 작동합니다. 하지만 내 응용 프로그램에서는 작동하지 않습니다. 인스턴스가 호출되는 방법에 대한 자세한 내용을 추가했습니다. 그걸 확인해 주시겠습니까? 감사합니다 – ganeshran

답변

1

종속성 삽입 컨테이너를 올바르게 사용하고 있습니다. 예를 들어, 게시물에 표시되는 Resolver 클래스는 단순히 유형의 팩토리 또는 제공자로 작동합니까?

의존성 주입을 사용하는 경우 등록, 해결 및 릴리스 RRR 패턴을 확실히 따르고 싶습니다. 등록은 응용 프로그램의 구성 루트에서 수행되어야합니다. ASP.Net MVC의 경우 코드 숨김의 Application_Start 메서드와 같이 일반적으로 Global.asax 내에 어딘가에 있습니다. 이 작업은 응용 프로그램 풀 시작 (IIS의 경우) 당 한 번만 수행해야합니다.

우연히 주위에 컨테이너 (또는 컨테이너를 인스턴스화하고 등록을 수행하고 나중에 해결을 수행하는 객체)를 전달하는 경우 —이 "다른 인스턴스"가 표시 될 수 있습니다. 두 개의 다른 컨테이너. 컨테이너 주위를 지나가고 있지 않더라도, 각 요청 후에 컨테이너가 가비지 수집되고 후속 요청에서 다시 작성되도록 컨테이너를 어딘가에 인스턴스화하는 경우, 사용자는 싱글 톤의 "다른 인스턴스"를 볼 수 있습니다 객체가 해석되고 인스턴스화됩니다. 다시, 각각은 컨테이너의 다른 인스턴스에서옵니다. 이를 확인할 수있는 한 가지 방법은 컨테이너에서 해결 된 객체가 동일한 컨테이너 인스턴스에서도 발생하는지 확인하는 것입니다.

HTH.

관련 문제