Abstract: Many of our modern frameworks have Dependency Injection (DI) built in. But how do we use that effectively? We'll look at what DI is and why we want to use it. We'll see the problems caused by tight coupling. Then we'll use some DI patterns such as constructor injection and property injection to break that tight coupling. We'll see how loosely-coupled applications are easier to extend and test. With a better understanding of the basic patterns, we'll remove the magic behind DI containers so that we can use the tools appropriately in our code.