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