Desarrollador .NET: pregunta de entrevista
¿En qué se diferencian los ciclos de vida de DI en .NET?
Transient crea en cada resolución, scoped reutiliza una instancia por solicitud o scope y singleton vive toda la aplicación. Un singleton no debe capturar servicios scoped y su estado compartido debe ser thread-safe.
Respuesta directa
Qué debe cubrir una buena respuesta
Cómo funciona
Los servicios transient se construyen cada vez que se resuelven. Los scoped se construyen una vez por ámbito, que en ASP.NET Core es una solicitud HTTP, así que un DbContext registrado como scoped lo comparte todo lo que ocurre en esa solicitud y se libera al terminar. Los singleton se construyen una vez por aplicación. El contenedor aplica una regla al validar: un singleton no debe depender de un servicio scoped, porque capturaría para siempre la instancia de la primera solicitud. Los singleton deben ser thread-safe, y todo lo IDisposable lo libera el ámbito que lo creó.
Ejemplo
Un servicio en segundo plano registrado como singleton necesitaba el DbContext; inyectarlo directamente falló en la validación al arrancar. La solución inyectó IServiceScopeFactory, creó un ámbito por unidad de trabajo, resolvió el DbContext dentro y liberó el ámbito. Un envoltorio de HttpClient se registró mediante IHttpClientFactory para que los handlers se reutilicen en lugar de agotar sockets con un HttpClient transient.
Errores frecuentes
- Registrar DbContext como singleton y compartirlo entre hilos.
- Resolver un servicio scoped desde el proveedor raíz y no liberarlo nunca.
- Hacer que un servicio transient mantenga estado caro como un pool de conexiones.
Una estructura útil para responder
Responde desde tu propia experiencia.
No memorices un guion: usa solo ejemplos que puedas explicar con honestidad en preguntas posteriores.
Abre el espacio de trabajo de escritorio y ensaya una respuesta clara con tus propias palabras.