Non c'è magia a meno che tu non consideri la magia iniezione di dipendenza . Se ti trovi nel codice di avvio / bootstrap dell'app, quasi sicuramente troverai un contenitore IoC . Cerca in Global.asax.cs e segui i percorsi dal gestore di eventi di avvio dell'applicazione. Troverete la registrazione di componenti / servizi da qualche parte. A volte è giusto nel Global.asax, a volte è memorizzato in App_Start, a volte è nella radice, ea volte è altrove. È lì, però.
Le ultime versioni di ASP.NET vengono fornite con integrazione delle dipendenze integrata . Le ultime versioni di MVC l'hanno messo in uso .
Se stai utilizzando un framework più vecchio, ci sono molti contenitori di terze parti. Alcuni esempi:
Il principio è semplice. Si registra qualche tipo concreto come la rappresentazione attiva di un contratto. (Il contratto è solitamente un'interfaccia, ma potrebbe anche essere un tipo concreto.) Quindi nel codice, si fa sempre riferimento alle cose come contratti. Il contenitore ti dà il tipo registrato, ma non devi pensare ai dettagli. Ciò semplifica lo scambio di implementazioni in un unico luogo. Che a sua volta rende facile fare cose come pezzi di codice di prova usando oggetti finti prevedibili contro l'uso di oggetti complessi e imprevedibili. Gli oggetti complessi rendono difficile capire cosa stai veramente testando.
Oltre alla registrazione di tipi come contratti, i contenitori IoC fanno anche cose di fantasia come iniettare automaticamente i tipi nei componenti gestiti. Questo è quello che stai vedendo nel tuo esempio. Il contenitore gestisce i controller in modo che sappia fornire EmployeeController
al AdvancedSearchController
. Chissà? Forse ha iniettato un altro tipo in EmployeeController
prima di inviarlo. (Non l'hai chiesto, ma non mi fa impazzire il passaggio dei controller in giro. Se hai qualche parola in proposito, lasciala. Sostituiscilo con alcuni non controller che fanno il lavoro necessario. .)
Alcuni contenitori ti permettono anche di decidere la durata dei tuoi tipi registrati - forse vengono istanziati ogni volta che vengono utilizzati, forse un oggetto rimane in agguato per la durata di una richiesta web (chiazza di petrolio per la gestione di un'unità di lavorare in un servizio web), o forse ce n'è sempre solo uno.