Sto lavorando a un piccolo risolutore delle dipendenze leggero trovato qui
Attualmente se lo fai
var instance = container.Get<Foo>();
Ottieni una nuova istanza per ogni chiamata a Ottieni
Questo è corretto quando ci si trova in una gestione a vita transitoria. Ma qual è il comportamento previsto quando si utilizza l'iniezione del costruttore?
Diciamo che hai questa catena di dipendenze, con gli argomenti del costruttore
ClassOne (ClassTwo, ClassThree)
ClassTwo (ClassThree)
Ora facciamo un container.Get<ClassOne>()
; Dovrebbe essere ClassThree
uguale per ClassOne
e ClassTwo
?
modifica: la domanda è: secondo te, la maggior parte degli utenti si aspetta che il comportamento del tempo di vita transitorio si abbini all'iniezione del costruttore durante una chiamata a Get<T>
.
modifica: Sia Ninject, Castle e Unity sembrano creare nuove istanze, quindi probabilmente questo è il modo in cui dovrebbe funzionare (e questo è il modo in cui funziona proprio ora)
modifica: hmmm. Interessante StructureMap in realtà riutilizza l'istanza, ecco l'output di un test che ho fatto (i numeri sono hashcode)
Ninject.StandardKernel 65778530 34340385
Microsoft.Practices.Unity.UnityContainer 9874138 2186493
Castle.MicroKernel.DefaultKernel 27253481 44856655
StructureMap.Container 14259084 14259084
Codice per testare sopra link
modifica:
In realtà se non si specifica .LifestyleTransient()
, il castello avrà lo stesso comportamento di StructureMap, il che significa che sarà la stessa istanza per Resolve