Dependency Injection (DI) involves passing (injecting) one or more dependencies (or services) to a dependent object (or client) which become part of the client's state. It is like the Strategy Pattern, except the strategy is set once, at construction. DI enables loosely coupled designs, which are easier to maintain and test. Features: - None run-time overhead; - Compiles fast; - Gives short diagnostic messages; - Is non-intrusive; - Reduces boilerplate code; - Reduces testing effort; - Gives better control of what and how is created; - Gives better understanding about objects hierarchy. Design goals: - Be as fast as possible; - Compile as fast as possible; - Give short and intuitive error messages; - Guarantee object creation at compile-time; - Be as non-intrusive as possible; - Be easy to extend.