How Dependency Injection Works Explained by Code