Que es inyección de dependencias (DI)

La inyección de dependencias es un patrón de diseño orientado a objetos en el que se pasan las referencias necesarias a una clase en lugar que esta se encargue de crearlas.

Vamos a ver un ejemplo sin DI:

public class OrderService
{
    private OrderRepository repository;
    public OrderService()
    {
        repository = new OrderRepository();
    }
}

Se puede observar que dentro del constructor de OrderService estamos instanciando el repositorio.

Y ahora con DI:

 
public class OrderService 
{
 private OrderRepository repository; 
public OrderService(OrderRepository repo) 
{ 
repository = repo; 
} 
}

Vemos que ahora el repositorio es inyectado en el constructor, es la forma mas habitual para hacer inyección de dependencias, se pueden utilizar otras estrategias como: inyectar en métodos o propiedades.

Mejora
Si seguimos la D de SOLID, que indica: los módulos de alto nivel no deben depender de módulos de bajo nivel, sino de sus abstracciones. Seria ideal definir una interfaz para el repositorio y en lugar de inyectar OrderRepository, indicáramos la interfaz IOrderRepository.

Estrategias para inyectar dependencias

• Inyección por constructor (Constructor injection)

Se pasan las referencias en el constructor del objeto. Este es el use mas habitual.

public class OrderService
{
    private IOrderRepository repository;
    public OrderService(IOrderRepository repo)
    {
        repository = repo;
    }
}

• Inyección por propiedad (Property injection o setter injection)

Se crea una propiedad para asignar una dependencia.

public class OrderService
{
    private IOrderRepository OrderRepository { get; set; }
}

• Inyección por parámetro (Parameter injection)

Se agrega un parámetro en la firma de un método por cada dependencia que se necesite.

public class OrderService
{
    private int GetOrderId(IOrderRepository repo)
    {
        // Código
    }
}