Following on from my previous post about dependency injection, the topic of IoC containers feels like a nice continuation. I wanted to keep the two posts separate, because it's important to understand that you do not need an IoC Container just because you want to inject your dependencies. Dependency injection itself is a very simple concept - all you're doing is passing an instance of the dependency into your code as an abstraction (ie. via an interface or abstract class the dependency implements). You do not need an IoC container to do this. An IoC Container is just a library to help you manage doing so.
Following on from my post about why you should write automated tests, I wanted to talk about how to write code that is testable. Unfortunately, unless you explicitly know how to write testable code, and are familiar with the SOLID principles (which from my experience, the average developer isn't!) - then the natural way we write code, and the way we typically learn to code makes it very hard to write unit/integration tests against our code.