Structuremap in Singleton che restituisce più istanze

Ho registrato 5 classi derivate per la stessa interfaccia usando istanze nominate. Tutte queste classi sono registrate come Singleton

For().Singleton().Use().Named("Derived1"); For().Singleton().Use().Named("Derived2"); For().Singleton().Use().Named("Derived3"); 

Esiste una class statica che risolve l’istanza in base all’input. Tuttavia ho osservato che ogni chiamata a ObjectFactory.GetInstance restituisce nuove istanze su ogni richiesta anziché su Singleton. Non ci sono thread nell’applicazione pure.

Qualche idea sul perché questo sta accadendo?

Modificare:

Un helper con risoluzione statica causa problemi? Questo è il modo in cui risolvo l’istanza. Singleton funziona correttamente in un’applicazione di esempio ma non funziona sulla mia macchina.

Per aggiungere ulteriori dettagli, il progetto è MVC Web API e sto testando su IIS locale. Sono positivo che non ci siano thread creati dall’utente nell’applicazione.

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

Farei attenzione a utilizzare correttamente il contenitore di iniezione delle dipendenze. Ad esempio, la class Resolver che mostri nel tuo post, agisce semplicemente come un tipo di Factory o Provider?

Quando usi Dependency Injection, vuoi essere sicuro e seguire il modello RRR: Register, Resolve e Release. La registrazione dovrebbe avvenire nella radice della composizione dell’applicazione. Per ASP.Net MVC, è ususally da qualche parte all’interno di Global.asax , come nel metodo Application_Start del code-behind. Ciò dovrebbe verificarsi solo una volta per l’avvio del pool di applicazioni (per IIS).

Se per caso stai passando il contenitore (o un object che crea un’istanza di un contenitore ed esegue la registrazione e la successiva risoluzione), cosa che non dovresti fare, è ansible che queste “diverse istanze” che stai vedendo provengano da due contenitori diversi. Anche se non stai passando il contenitore, di per sé, se stai istanziando il tuo container da qualche parte in modo tale che, dopo ogni richiesta, il contenitore viene raccolto e ricreato in caso di richieste successive, potresti vedere una “diversa istanza” del singleton oggetti risolti e istanziati; ancora, ognuno proveniente da una diversa istanza del contenitore. Un modo per verificarlo è verificare che gli oggetti risolti dal tuo contenitore provengano anche dalla stessa istanza contenitore.

HTH.