Angular Dependency Injection: Explained in Depth