IoC (Inversion of Control) — это принцип проектирования, при котором поток управления программы инвертируется. Вместо того чтобы компоненты самостоятельно создавать свои зависимости, их созданием и управлением занимается внешний контейнер.
Внедрение зависимостей (Dependency Injection, DI) — это шаблон проектирования, который является одним из способов реализации принципа IoC. При DI зависимости компонента передаются ему извне, а не создаются внутри самого компонента.
Разница между IoC и DI заключается в следующем:
DI — это "как" достичь IoC.
Другими словами, DI является подмножеством IoC. IoC может быть реализован различными способами, и DI — один из наиболее популярных и эффективных из них.