Dependency Injection is a more specific type of Inversion of Control. Dependency Injection inverts traditional procedural control of dependencies from direct creational dependency (through invocation of constructors) to an indirect dependency. Instead of dependencies being created directly (call us), they are injected into the class that depends on them from an external source (call you). When this is coupled with Interface-based Design we can obtain the loosest coupling. This level of modularity allows both the containing class and its dependencies to evolve independently.
By shifting object creation in this way, the how and what that are instantiated are completely independent of a particular class and can vary completely independently. For example, a pedantic (for the sake of illustrative purposes) invoice rendering service could be implemented as follows:
/// <summary> /// Service to encapsulate rendering of an invoice /// </summary> public class InvoiceRenderingService...