The Dependency Inversion Principle states that high-level modules should not depend on low-level modules, but should depend on abstractions. Both high- and low-level modules should depend on abstractions, not on details. Inversion of Control is an aspect of software design where objects are provided to other objects rather than created by them. Dependency Injection is a design pattern that reduces coupling between components by allowing objects to receive their dependencies from external sources rather than creating them directly.