Concisely, dependency injection is a design pattern that allows the class dependencies to be created by something outside of its control and passed to it (which applies the Dependency Inversion of Control). That "something" is also supposed to control the lifetime of those dependencies.
The patterns used to pass those dependencies created outside the class are as follows:
- Constructor Injection
- Property Injection
- Method Injection
- Ambient Context