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

Inyección de dependencias y composición · caso de reservasC#

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

  1. Registra el contrato y la implementación en el contenedor.
  2. El consumidor declara lo que necesita en su constructor o parámetro.
  3. 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.

Cancelar desde una identidad validadaC#

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.

  1. 01Prepara el ejemplo con las dependencias indicadas en «Antes de ejecutar».
  2. 02Construye CancelarReserva directamente con MemoriaReservas y luego compón un host con un adaptador por ámbito.
  3. 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.

Guardado local automático
Material de apoyo · descarga, glosario y referencias
Libro de trabajo · Inyección de dependencias y composiciónLaboratorio C# · núcleo y 15 comprobaciones

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.