Avec l'IoC, le framework ([cadriciel]) prend en charge l'exécution principale du programme ; il coordonne et contrôle l'activité de l'application. Le programme utilisateur définit alors les blocs de codes en utilisant l'API fournie à cet effet par le framework, sans relation dure entre eux. Ces blocs de codes sont laissés à la discrétion du framework qui se chargera de les appeler.
L'IoC est illustré par le principe d'Hollywood : "Ne nous appelez pas, c'est nous qui vous appellerons". Selon ce principe, l'inversion de contrôle a lieu entre le framework (ou la couche logicielle sous-jacente) et l'application. Ce n'est plus l'application qui gère les appels au framework, mais ce dernier à l'application.
Exemple :
Soit une application qui demande des informations sur l'utilisateur. Selon l'approche classique, le corps du programme pose non seulement les briques d'interaction Homme-Machine (IHM) mais contrôle aussi la séquence d'exécution de celles-ci.
Exemple en pseudo langage :print 'Votre nom :' read nom traite nom print 'Votre âge :' read age traite age ...
Avec l'IoC, le framework s'assure du contrôle du flot d'exécution souvent sous la forme d'une fonction principale. Le corps principal du programme prend alors en charge seulement le traitement et, dans une moindre mesure, les briques IHM.
Exemple en pseudo langage :framework <- init q1 <- question 'Votre nom :' attache_traitement q1, mon code q2 <- question 'Votre âge :' attache_traitement q2, mon_autre_code boucle_principale framework
Ici, le framework d'abord est initialisé, puis les composants qui font l'IHM du programme sont ensuite créés. À ces composants sont attachés un traitement à exécuter par le framework lorsque ceux-ci sont devenus actifs par action de l'utilisateur. Puis, pour finir, le contrôle de l'application est passé au framework .