Per parlare in gergo, l'inversione di controllo è uno schema che supporta, tra le altre cose, il principio di responsabilità singola.
Per ottenere il motivo per cui tutto ciò è utile, è necessario un po 'di esposizione, quindi portami con me.
La singola responsabilità significa fondamentalmente che la classe deve essere il più indipendente possibile da altre parti del sistema, per ridurre al minimo l'impatto del cambiamento di una parte sull'altra. (Puoi anche ricollegarlo al fatto che la modifica dell'implementazione non dovrebbe innescare la ricompilazione di tutti i file nei tuoi progetti, come nel caso della modifica dei file .h in un progetto C/C++, ad esempio). L'effetto collaterale è che si finisce con un sacco di piccoli oggetti che fanno solo una cosa, ma molto bene (in un mondo ideale)
Ma nella maggior parte dei casi, per svolgere il suo lavoro, un oggetto deve parlare con altro oggetto: dipende da loro.
Prima parte dell'attenuazione che separa l'implementazione dalle interfacce. Ciò significa affidarsi a interfacce (o classi puramente astratte, a seconda della lingua di scelta), in modo che un oggetto non sia legato all'implementazione specifica di un altro.
Quindi, per usare un esempio canonico, nei bisogni livello di business, è necessario svolgere una funzione che ha bisogno di accedere a - Lo strato di dati per recuperare oggetti - qualche altro servizio - un registratore per registrare le informazioni eo errori
A sua volta, ogni servizio o dipendenza ha le sue dipendenze, di cui la classe dovrebbe essere a conoscenza anche se non le utilizza. A seconda della quantità di riferimenti, l'impostazione dell'oggetto può andare rapidamente fuori mano. Ora moltiplicalo per il numero di classi che devi scrivere e finisci con un casino di cose.
L'utilizzo di un contenitore IOC aiuta a liberarsi di questo pasticcio. Quando hai bisogno di un oggetto, non lo "fai da te". Invece chiedi al contenitore IOC di recuperarlo per te. Il contenitore è responsabile della consegna di un oggetto funzionale, pronto per essere utilizzato, indipendentemente dalle sue dipendenze.
Ciò significa che la classe non ha bisogno di essere consapevole delle dipendenze delle classi su cui fa affidamento, il che riduce il groviglio. Inoltre, non ha bisogno di sapere quale classe reale implementa i servizi su cui si basa, ovvero - L'implementazione del servizio può essere definita in un altro progetto (DLL o qualsiasi altra cosa), quindi la modifica non avrà alcun impatto sulla classe - L'implementazione può essere diverso a seconda del contesto (pensare a cambiare il database, o anche andare a un servizio web per recuperare le informazioni a seconda della configurazione o anche lo stato attuale dell'applicazione).
Per provare a rispondere alle altre domande, IOC è uno schema. TDD e DDD sono metodologie di progettazione, quindi non si può equiparare l'altro. Ma IOC è uno strumento inestimabile per supportare TDD o DDD.
Conosco la zuppa acronimo e i campioni parziali che si possono trovare in giro non sono facili da preparare. Il miglior consiglio che posso darti è di provare alcuni piccoli progetti sul lato, i prototipi che ti abbandoneranno, solo per avere una mano su queste cose. Non è un modo semplice per andare se lo si guarda per lavoro, ma ne vale assolutamente la pena, anche se solo da un punto di vista personale.
La speranza aiuta un po '.
CIO come in Inversion of Control - Il modello di progettazione? – dirkgently