Let's say that you have a service class, i.e. part of your BLL, and it has a dependency on a repository class, i.e. part of your DAL. If the service class creates an instance of the repository class internally then the two a tightly coupled. It's impossible to test the service class independently because, in order to create an instance of the service class, you must be able to create an instance of the repository class. If that repository gets its data from your database then it's impossible to test the service without having a live database. That means that you will always have to have the appropriate data in your database to fulfil your testing requirements and your tests will be slow because of the overhead of data access.

By injecting an interface instead, you can create a mock during testing. Unlike a fake, a mock has no actual implementation. You just tell it that when some method or property is accessed on the interface then some result occurs, without ever having to write any code that creates that result. By using IoC you can specify how dependencies are implemented using configuration alone.