2013-05-24 11 views
5

Mam zarejestrowanych 5 klas pochodnych dla tego samego interfejsu przy użyciu nazwanych wystąpień. Wszystkie te klasy są zarejestrowane jako SingletonMapa struktury w Singleton zwraca wiele instancji

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

Istnieje klasa statyczna, która rozwiązuje wystąpienie na podstawie danych wejściowych. Jednak zauważyłem, że każde wywołanie ObjectFactory.GetInstance zwraca nowe wystąpienia na każde żądanie zamiast Singleton. W aplikacji również nie ma wątków.

Każdy pomysł, dlaczego tak się dzieje?

Edytuj:

Czy pomocniczy asystent rozdzielczości powoduje problemy? W ten sposób rozwiązuję instancję. Singleton działa poprawnie w przykładowej aplikacji, ale nie działa na moim komputerze.

Aby dodać więcej szczegółów - projekt to MVC Web API i testuję na lokalnych usługach IIS. Jestem pewien, że w aplikacji nie ma nic wspólnego z użytkownikami.

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

Nie mogę powtórzyć twoich wyników. Przeprowadziłem twoje rejestracje i wypróbowałem oba z 'GetInstance' i' GetNamedInstance'. 'GetInstance' zwraca za każdym razem ostatnią zarejestrowaną instancję. 'GetNamedInstance (" Derived1 ")' zwraca za każdym razem to samo wystąpienie 'DerivedClass1'. – PHeiberg

+0

Tak, proszę napisać przykład, który odtwarza problem. – neontapir

+0

Witaj PHeiberg i neontapir, próbowałem utworzyć prosty przykład kodu i działa w nim dobrze. Ale w mojej aplikacji to nie działa. Dodałem trochę więcej szczegółów na temat wywoływania instancji. Czy możesz to sprawdzić. Dzięki – ganeshran

Odpowiedz

1

Byłbym ostrożny, jeśli prawidłowo używasz pojemnika Dependency Injection. Na przykład klasa Resolver, która jest wyświetlana w poście, działa jak zwykły typ fabryki lub dostawcy?

Korzystając z Dependency Injection, należy się upewnić i postępować zgodnie ze schematem RRR: Zarejestruj, rozwiązuj i zwolnij. Rejestracja powinna nastąpić w katalogu głównym aplikacji. Dla ASP.Net MVC, jest to zwykle gdzieś w zakresie Global.asax, na przykład w metodzie Application_Start kodu z tyłu. Powinno to nastąpić tylko raz dla każdego uruchomienia puli aplikacji (dla IIS).

Jeśli przez przypadek mijasz kontener (lub obiekt, który tworzy kontener i wykonuje rejestrację, a następnie rozwiązuje problem) —, którego nie powinieneś robić, —, możliwe, że te "różne instancje", które widzisz pochodzą z dwa różne pojemniki. Nawet jeśli nie omijasz kontenera, per se, jeśli tworzysz gdzieś swój pojemnik, tak, że po każdym żądaniu pojemnik jest śmieciem zbieranym i odtwarzanym na kolejnych prośbach, możesz zobaczyć "inne wystąpienie" singletonu obiekty są rozwiązywane i tworzone; ponownie, każdy pochodzący z innej instancji kontenera. Jednym ze sposobów weryfikacji tego jest sprawdzenie, czy obiekty rozwiązane z kontenera pochodzą również z tej samej instancji kontenera.

HTH.