L'iniezione di dipendenza può sembrare inizialmente confusa, ma in realtà è piuttosto semplice.
Un "contenitore" di Iniezione di dipendenza è fondamentalmente una fabbrica generica con varie funzioni di gestione della durata dell'oggetto. In particolare, Ninject utilizza la sintassi kernel.Bind()
per confgurare questa fabbrica.Quando dici kernel.Bind<DbEntities>().ToSelf()
questo significa che Ninject creerà un'istanza del tipo associato (DbEntities in questo caso) ogni volta che quel tipo viene richiesto. Questa richiesta è in genere la seguente:
var entities = kernel.Get<DbEntities>(); // Note: don't do this, just an example
Al suo centro, questo è ciò che è Dipendenza Iniezione. Una fabbrica generica in grado di istanziare tipi arbitrari.
Tuttavia, c'è molto di più. Una buona caratteristica di Dependency Injection è che istanzia anche qualsiasi tipo dipendente nel processo. Quindi, supponiamo di avere un controller e quel controller ha una dipendenza da DbEntities. Bene, quando un controller viene istanziato dal framework DI, creerà anche un'istanza delle DbEntities dipendenti. Guarda il codice qui sotto. Quando il MyController viene istanziato, i DbEntities otterrà automaticamente un'istanza (ammesso che abbiate legato alla classe DbEntities di auto nella configurazione DI)
var controller = kernel.Get<MyController>();
public class MyController : Controller {
private DbEntities _entities;
public MyController(DbEntities entities) {
_entities = entities;
}
}
Questo è ricorsiva. Qualsiasi classe che viene istanziata e che ha oggetti da cui dipenderà può anche essere istanziata, e così via, e così via fino a che, finalmente, tutto ha ciò di cui ha bisogno per fare il suo lavoro.
Ora, la cosa bella di MVC è che ha un modo integrato per utilizzare automaticamente qualsiasi contenitore DI. Non è necessario chiamare lo kernel.Get
perché il framework lo fa per te quando crea i controller quando arriva una richiesta. Questa funzione è chiamata IDependencyResolver
ed è un'interfaccia che il framework MVC utilizza per consentire l'utilizzo di contenitori DI di terze parti dal quadro. sezione
Se si installa Ninject utilizzando il pacchetto Nuget Ninject.MVC3 allora configurerà automaticamente tutto questo per voi, ed è necessario solo aggiungere le associazioni ai RegisterServices() di NinjectMVC3.cs
C'è un sacco più di questo, ma questo dovrebbe darti una comprensione di base. L'Iniezione delle Dipendenze ti permette di dimenticare i dettagli della gestione degli oggetti creati e distrutti, devi solo specificare nel tuo costruttore quali dipendenze hai bisogno e supponendo che tu abbia dei collegamenti per loro nella tua configurazione, MVC si prenderà cura di crearli e distruggerli per tu. Li usi e basta.
EDIT:
Per essere chiari, non mi consiglia di utilizzare gli esempi dò sopra. Sono solo semplici illustrazioni di come funziona DI. In particolare, la sintassi Get() è nota come "Posizione del servizio" ed è considerata non valida. Tuttavia, in definitiva un codice, da qualche parte deve chiamare Get(), è solo sepolto nel profondo del framework.
Come afferma Adam, il collegamento diretto al contesto delle entità di dati non è una grande idea e alla fine dovresti passare a utilizzare un approccio basato sull'interfaccia.
Grazie. Ho scaricato il campione, ma ci sono così tante cose che è difficile dire cosa sta facendo cosa.Non capisco come Bind funzioni ancora, ma quella linea sembra essere tutto ciò che serve per dare al costruttore del controllore il contesto. Puoi consigliare articoli o tutorial che spieghino in effetti che cosa sta succedendo qui? – Tyrsius
Vorrei controllare i collegamenti su 'http: // ninject.org/learn', anche in generale per l'iniezione di dipendenza dai un'occhiata al libro" Dipendenza da iniezione in .NET "di Mark Seemann – BrokenGlass