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
}
}