La chiave dei contenitori DI è l'astrazione . I contenitori DI astraggono questa preoccupazione del design per te. Come puoi immaginare, ha un notevole impatto sul codice, spesso tradotto in un numero inferiore di costruttori, setter, fabbriche e costruttori. Di conseguenza, rendono il tuo codice più liberamente accoppiato (a causa dell'IoC sottostante ), più pulito e più semplice. Anche se non senza costi.
sfondi
Anni fa, tale astrazione ci richiedeva di scrivere vari file di configurazione ( programmazione dichiarativa ). È stato fantastico vedere il numero di LOC diminuire sostanzialmente, ma mentre i LOCS sono diminuiti, il numero di file di configurazione è leggermente aumentato. Per progetti medi o piccoli non è stato affatto un problema, ma per progetti più grandi, avere "l'assemblaggio del codice" sparso il 50% tra descrittori di codice e XML è diventato un problema nel ... Tuttavia, il problema principale era il stesso paradigma. Era piuttosto inflessibile perché i descrittori lasciavano poco spazio alle personalizzazioni.
Il paradigma si è progressivamente spostato verso la convenzione sulla configurazione , che scambia i file di configurazione per annotazioni o attributi. Mantiene il nostro codice più pulito e semplice e ci fornisce la flessibilità che XML non è in grado di offrire.
Probabilmente, questa è la differenza più significativa rispetto a come stavi lavorando fino ad ora. Meno codice e più magia.
Sul lato negativo ...
La convenzione sulla configurazione rende l'astrazione così pesante che a malapena sai come funziona. A volte sembra magico e qui arriva un altro inconveniente. Una volta che funziona, molti sviluppatori non si preoccupano di come funziona.
Questo è un handicap per coloro che hanno imparato DI con contenitori DI. Non comprendono appieno la rilevanza dei modelli di progettazione, le buone pratiche e i principi che sono stati astratti dal contenitore. Ho chiesto agli sviluppatori se avevano familiarità con DI e i suoi vantaggi e hanno risposto: - Sì, ho usato Spring IoC -. (Che diavolo significa?!?)
Si può concordare o meno con ciascuno di questi "svantaggi". Secondo la mia modesta opinione, è d'obbligo sapere cosa sta succedendo nel tuo progetto. Altrimenti, non ne abbiamo una piena comprensione. Inoltre è sapere a cosa serve DI e avere un'idea di come implementarlo è un vantaggio da considerare.
Il lato positivo...
Produttività in una parola . I frame ci permettono di concentrarci su ciò che conta davvero. Il business dell'applicazione.
Nonostante le carenze commentate, per molti di noi (il cui lavoro è condizionato da scadenze e costi), questi strumenti sono una risorsa inestimabile. A mio avviso, questo dovrebbe essere il nostro argomento principale a favore dell'implementazione di un contenitore DI. Produttività .
analisi
Sia che implementiamo DI o container puri, i test non saranno un problema. Piuttosto il contrario. Gli stessi contenitori spesso ci forniscono le beffe per i test delle unità pronti all'uso. Nel corso degli anni ho usato i miei test come termometri. Mi dicono se ho fatto molto affidamento sulle strutture dei container. Dico questo perché questi contenitori possono inizializzare attributi privati senza setter o costruttori. Possono iniettare componenti quasi in qualsiasi luogo!
Sembra allettante vero? Stai attento! Non cadere nella trappola !!
suggerimenti
Se decidi di implementare contenitori, ti consiglio vivamente di attenermi alle buone pratiche. Continuare a implementare costruttori, setter e interfacce. Applicare il framework / contenitore per usarli . Semplificherà le migrazioni possibili verso un altro framework o rimuoverà quello effettivo. Può ridurre significativamente la dipendenza dal contenitore.
Riguardo a queste pratiche:
Quando utilizzare i contenitori DI
La mia risposta sarà distorta dalla propria esperienza, che è principalmente a favore dei contenitori DI (come ho commentato, sono fortemente concentrato sulla produttività, quindi non ho mai avuto il bisogno di DI puro. Al contrario).
Penso che troverai un interessante articolo di Mark Seeman su questo argomento, che risponde anche alla domanda su come implementare un DI puro .
Infine, se stessimo parlando di Java, prenderei in considerazione prima di dare un'occhiata a JSR330 - Dependency Injection .
Riassumendo
Vantaggi :
- Riduzione dei costi e risparmio di tempo. Produttività.
- Un numero inferiore di componenti.
- Il codice diventa più semplice e pulito.
Svantaggi :
- DI è delegato a librerie di terze parti. Dobbiamo essere consapevoli dei loro compromessi, punti di forza e debolezza.
- Curva di apprendimento.
- Ti fanno rapidamente dimenticare alcune buone abitudini.
- Aumento delle dipendenze del progetto (più lib)
- I contenitori basati sulla riflessione richiedono più risorse (memoria). Questo è importante se siamo limitati dalle risorse.
Differenze con DI puro :
- Meno codice e più file di configurazione o annotazioni.