01
Qué es y qué problema resuelve
La inyección entrega colaboradores desde fuera en lugar de construirlos dentro de cada consumidor. La raíz de composición conecta contratos con implementaciones.
El constructor hace visibles requisitos y facilita probar variantes sin alterar el caso de uso.
02
Ejemplo paso a paso
Punto de partida Fragmento de composición ASP.NET Core. No declares que funciona antes de implementar y registrar las dependencias del repositorio.
Antes de ejecutar
Requiere un host ASP.NET Core 10 preparado. builder y app corresponden a WebApplication.CreateBuilder y Build; las variables y tipos auxiliares deben definirse. Registra los servicios usados antes de Build. El ZIP de consola no contiene esta API. Los adaptadores y servicios nombrados son tipos del ejercicio que debes implementar.
builder.Services.AddScoped<IReservas, RepositorioReservas>();
builder.Services.AddScoped<CancelarReserva>();
// CancelarReserva recibe IReservas por constructor.
// RepositorioReservas es el adaptador que debes implementar.Cómo funciona
- Registra el contrato y la implementación en el contenedor.
- El consumidor declara lo que necesita en su constructor o parámetro.
- El contenedor entrega esa implementación dentro del ámbito configurado.
Resultado esperado: El contenedor puede crear el caso de uso dentro de un ámbito de petición.
03
Cuándo usarlo y qué debes evitar
El contenedor no verifica que una interfaz tenga buen significado. Tampoco autoriza recursos ni crea automáticamente una transacción.
Registra dependencias con ámbito apropiado, evita resolver servicios arbitrariamente desde todo el código y falla al inicio cuando una dependencia obligatoria falta. Service locator suele ocultar lo que el consumidor necesita.
Ampliación opcional · contexto y variantes del tema
Composición, servicios y Minimal APIs
Program.cs es la raíz de composición: registra servicios y conecta endpoints. El endpoint recibe una petición, resuelve identidad, invoca el caso de uso y traduce el resultado a HTTP. Evita consultas y reglas repetidas en lambdas extensas. Controladores son una alternativa válida cuando sus convenciones y filtros ayudan; Minimal APIs son útiles para entradas concisas. Ambos pueden respetar las mismas fronteras.
Singleton dura toda la aplicación y requiere estado seguro ante concurrencia; Scoped se comparte dentro de un ámbito; Transient crea una instancia en cada resolución. DbContext suele ser Scoped. Un servicio hospedado es Singleton: crea un ámbito por trabajo mediante IServiceScopeFactory y resuelve dependencias dentro de él. Nunca almacenes un DbContext en un singleton ni reutilices un ámbito indefinidamente.
Punto de partida Fragmento para Program.cs con using System.Security.Claims y ASP.NET Core. Requiere configurar autenticación, autorización e IReservas. El claim solo es confiable después de validar la identidad del emisor.
Antes de ejecutar
Integración guiada, no incluida en la consola
builder.Services.AddScoped<CancelarReserva>();
// Registrar IReservas con un adaptador persistente por ámbito.
app.MapPost("/api/v1/reservas/{id:guid}/cancelacion",
async (Guid id, ClaimsPrincipal usuario,
CancelarReserva caso, CancellationToken ct) =>
{
var grupo = usuario.FindFirst("grupo_id")?.Value;
var resultado = await caso.EjecutarAsync(id, grupo, ct);
return resultado.Codigo switch
{
null => Results.NoContent(),
"no_encontrada" => Results.NotFound(),
"sin_permiso" => Results.Forbid(),
_ => Results.Problem(statusCode: 500)
};
}).RequireAuthorization();Resultado esperado: 204 al cancelar o repetir una cancelación propia; 403 para otro grupo; 404 para ausencia. No es una API completa.
04 · Práctica guiada · opcional
Practica lo aprendido
Construye CancelarReserva directamente con MemoriaReservas y luego compón un host con un adaptador por ámbito.
- 01Prepara el ejemplo con las dependencias indicadas en «Antes de ejecutar».
- 02Construye CancelarReserva directamente con MemoriaReservas y luego compón un host con un adaptador por ámbito.
- 03Comprueba y registra el resultado: El contenedor puede crear el caso de uso dentro de un ámbito de petición.
Ver solución orientativa
La prueba de dominio usa el constructor; la prueba de host confirma registro y resolución. Son garantías distintas.
05
Comprueba lo aprendido
Responde antes de abrir la explicación. Esta comprobación es opcional y no guarda una puntuación.
01¿La inyección corrige dependencia de infraestructura en dominio?
No. Corrige la dirección de referencias en el diseño, además de entregar instancias.
02¿Qué demuestra construir el objeto a mano y qué demuestra resolverlo desde el host?
La construcción manual comprueba que el caso de uso recibe un contrato explícito y funciona con el adaptador elegido. Resolverlo en el host comprueba además registros y ámbitos del contenedor.
Cómo demostrar el objetivo
Compara tu práctica con estos resultados. Si solo diseñaste una prueba, registra su resultado como esperado, no como observado.
- Construyes el caso de uso con un adaptador de memoria sin iniciar HTTP.
- En un host preparado, el contenedor resuelve el contrato y el caso de uso dentro de un ámbito.
Qué debes recordar
- DI entrega instancias.
- El diseño determina qué dependencia debe conocer cada componente.
Tu cuaderno · notas personales
Cuaderno local
Tus notas del contenido
Se guardan únicamente en este dispositivo. Puedes exportarlas cuando quieras.
Material de apoyo · descarga, glosario y referencias
Explicaciones, ejemplos y prácticas propios de Academia de Software. Los fragmentos de integración requieren las dependencias indicadas; el ZIP contiene el núcleo de consola. Las lecturas externas se consultan en su sitio original y conservan sus condiciones. Procedencia y condiciones de uso.