Dependency Injection means, in a nutshell, that you don't create the objects you need and you program against interfaces. By this, a class is easier to be tested, is much more independent of other code.
two examples:
First example:
using Core.Service.X;
using Core.Service.Y;
public class A //without injection
{
private ServiceX servicex;
private ServiceY servicey;
public A ()
{
servicex = new ServiceX();
servicey = new ServiceY();
}
}
In this example, class A has to be aware of ServiceX and ServiceY and their implementation (this is a very simple example, ServiceX and ServiceY could have complex constructors themselves.
Second example:
using Core.ServiceInterfaces;
public class B //without injection
{
private IServiceX servicex;
private IServiceY servicey;
public A (IServiceX serx, IServiceY, sery)
{
servicex = serx;
servicey = sery;
}
}
In this example, the class isn't aware of the specific implementation of either of the classes, it doesn't construct them itself. By this, the class is way more reuseable, as another party (normaly a DI-Container like Castle Windsor, Unity or MEF) takes care of the construction of these.