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