In termini semplici e/o in pseudo-codice di alto livello, come funziona un contenitore DI e come viene utilizzato?La spiegazione più semplice di come funziona un contenitore DI?
risposta
Al suo interno un contenitore DI crea oggetti basati sui mapping tra interfacce e tipi di calcestruzzo.
Questo vi permetterà di richiedere un tipo astratto dal contenitore:
IFoo f = container.Resolve<IFoo>();
Questo richiede di avere in precedenza configurato il contenitore per mappare da IFoo a una classe concreta che implementa IFoo (ad esempio Foo).
Questo di per sé non sarebbe particolarmente impressionante, ma Di Container fare di più:
- Essi usano Auto-cablaggio che significa che essi possono calcolare automaticamente che se IFoo mappe di Foo e mappe IBar a Bar, ma Foo ha una dipendenza da IBar, creerà un'istanza Foo con una barra quando richiedi IFoo.
- Gestiscono la durata della vita dei componenti. Molti vogliono una nuova istanza di Foo ogni volta, ma in altri casi si potrebbe desiderare la stessa istanza. Potresti anche volere nuove istanze di Foo ogni volta, ma la barra iniettata dovrebbe rimanere la stessa istanza.
volta che si inizia cercando di gestire manualmente composizione e vite si dovrebbe iniziare ad apprezzare i servizi forniti da un contenitore DI :)
Molti DI Container può fare molto di più di quanto sopra, ma quelli sono i servizi di base. La maggior parte dei contenitori offre opzioni per configuring via either code or XML.
Quando si tratta di utilizzare l' di contenitori, Krzysztof Kozmic ha appena pubblicato a good overview.
Si configura un contenitore DI in modo che conosca le proprie interfacce e tipi - il modo in cui ogni interfaccia si associa a un tipo.
Quando si chiama Resolve
su di esso, esamina la mappatura e restituisce l'oggetto mappato richiesto.
Alcuni contenitori DI utilizzano le convenzioni sulla configurazione, dove, ad esempio, se si definisce un'interfaccia ISomething
, verrà cercato un tipo di Something
concreto da istanziare e restituire.
"non è niente più che una fantasia hash tabella di oggetti."
Mentre il sopra è un eufemismo enorme che è il modo più semplice di pensare a loro. Data la raccolta, se si richiede la stessa istanza di una classe, il contenitore DI deciderà se fornire una versione memorizzata nella cache o una nuova o così via.
Il loro utilizzo rende più semplice e più pulito il cablaggio delle dipendenze. Immagina di avere le seguenti pseudo classi.
class House(Kitchen, Bedroom)
// Use kitchen and bedroom.
end
class Kitchen()
// Code...
end
class Bedroom()
// Code...
end
Costruire una casa è un dolore senza un contenitore DI, si avrebbe bisogno di creare un'istanza di una camera da letto, seguita da un'istanza di una cucina. Se anche quegli oggetti avevano delle dipendenze, dovresti collegarli. A sua volta, puoi spendere molte linee di codice semplicemente collegando gli oggetti. Solo allora potresti creare una casa valida. Usando un contenitore DI/IOC (Inversion of Control) si dice che si desidera un oggetto casa, il contenitore DI creerà ricorsivamente ciascuna delle sue dipendenze e restituirà una casa.
Senza DI/IOC container:
house = new House(new Kitchen(), new Bedroom());
Con DI/IOC container:
house = // some method of getting the house
Alla fine della giornata fanno codice facile da seguire, più facile da scrivere e spostare la responsabilità di collegare gli oggetti insieme lontano dal problema in questione.
Va notato che DI è buono perché impedisce di dover scrivere i propri costruttori complessi e il proprio codice per configurare le cose e un sacco di altre cose del genere. Mentre sì, non è * necessario *, è bello poter sfruttare una libreria esistente per gestire tutte queste cose per te. Rende la configurazione delle applicazioni Java (C# non è la mia area di competenza) sembra un po 'come lavorare con un linguaggio di scripting scadente, inconsistente, troppo complesso ... –
- 1. Una semplice spiegazione di Random Forest
- 2. Spiegazione di come funziona la comprensione degli elenchi?
- 3. Spiegazione di NSIncrementalStore in italiano semplice
- 4. Semplice funzione di quantmod non funziona più
- 5. Un semplice contenitore IoC per un piccolo sistema di plugin
- 6. Desideri semplice spiegazione di come "blocco striping" lavora con ConcurrentHashMap
- 7. Una breve spiegazione: come funziona JDBC?
- 8. come ottenere la spiegazione di gcc -s?
- 9. Come funziona un callback around_action? Una spiegazione è necessaria
- 10. Come scegliere un contenitore DI?
- 11. Come centrare più div all'interno di un contenitore in CSS
- 12. Una semplice spiegazione degli Anelli in Riak?
- 13. più semplice d3.js esempio non funziona
- 14. Spiegazione di matrici annidate a un programmatore
- 15. Contenitore di nidificazione all'interno di un bootstrap di un contenitore
- 16. Spiegazione di contribute_to_class
- 17. CanCan spiegazione di load_and_authorize_resource
- 18. L'esempio più semplice di Knockback js funziona con un webservice RESTful come ServiceStack?
- 19. Spiegazione concisa di Core.logic
- 20. Qual è il modo più semplice per avvolgere un file .aac grezzo in un contenitore .m4a
- 21. Come estendere una classe chiusa - bisogno di spiegazione semplice e l'uso di programmi in tempo reale
- 22. Spiegazione di 'o' nella sintassi dell'eccezione, perché è valida la sintassi e come funziona?
- 23. Initializer lista come contenitore non funziona
- 24. Uso più semplice di TypeAdapterFactory
- 25. Come funziona la ricerca vicino più vicino al KD-tree?
- 26. Spiegazione di splat
- 27. Come funziona questo semplice FxAA?
- 28. GAS: spiegazione di .cfi_def_cfa_offset
- 29. Allinea div con la parte superiore di un contenitore
- 30. Come si collega VisualVM a un semplice processo Java in esecuzione in un contenitore Docker
Breve e dolce e libero da analogie auto tossiche! – Shog9