potrebbe sembrare una domanda stupida, perché nel mio codice che tutto funzioni, ma ho registrato un singleton in questo modo con il mio contenitore Unità _ambientContainer
:UnityContainer.Resolve o ServiceLocator.GetInstance?
_ambientContainer.RegisterType<Application.StateContext>(new ContainerControlledLifetimeManager());
Al fine di evitare di usare il mio campo locale, io uso :
get {
return ServiceLocator.Current.GetInstance<Application.StateContext>();
}
all'interno della proprietà get per ottenere un'istanza del mio oggetto. In questo modo ottengo sempre la stessa istanza (Application.StateContext
è ancora un singleton) oppure lo GetInstance
ne crea uno nuovo?
È preferibile utilizzare il campo locale _ambientContainer
?
get {
return _ambientContainer.Resolve<Application.StateContext>();
}
Grazie.
Avete un suggerimento di un'alternativa? (specifico per il codice di esempio nella domanda?) – Adam
@Adam Un'alternativa a quale codice? Il getter? O la registrazione di 'Application.StateContext'? L'autore non ha detto che tipo di applicazione utilizza (asp.net/mcv, winforms, wpf, console, wcf ...), quindi non posso dire che dovresti inserire il codice di registrazione. Ogni tipo di app ha una diversa [radice di composizione] (http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx). Per quanto riguarda la chiamata al localizzatore di servizi: rendere 'StateContext' un parametro ctor di quelle classi che ne hanno bisogno. Ciò rende la dipendenza esplicita e intercambiabile (ad esempio per i test). –
Qualsiasi modello è un pattern anti se lo si utilizza nel modo sbagliato. TUTTE le librerie DI utilizzano la posizione del servizio sotto le copertine, altrimenti non funzionano. Non credere a tutto ciò che leggi su internet! – JBeckton