Dependency Injection

Provee dependencias a un objeto desde fuera en lugar de que las construya él mismo.

Contexto

Una clase que construye sus dependencias con new queda atada a ellas. No puedes mockear, ni cambiar implementaciones.

Problema

Acoplamiento + testabilidad nula.

Solución

Pasa las dependencias por constructor; un contenedor las resuelve.

#Ejemplo en C# — DI nativo de .NET

// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IClock, SystemClock>();
builder.Services.AddScoped<IOrderRepository, EfOrderRepository>();
builder.Services.AddScoped<PostPublisher>();

// Service consume dependencias por ctor
public class PostPublisher
{
    private readonly IOrderRepository _repo;
    private readonly IClock _clock;
    public PostPublisher(IOrderRepository r, IClock c) { _repo = r; _clock = c; }
}

#Lifetimes en .NET

Lifetime Vive durante Uso típico
Singleton Toda la app Caches, clocks, opciones
Scoped Una request HTTP / scope DbContext, repositorios
Transient Cada resolución Servicios sin estado
Cuándo NO aplicarlo
  • Para tipos primitivos o records de datos: usa parámetros normales.
  • DI por propiedad (setter) → frágil, prefiere ctor.

#extra #ioc #di