es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tareas en segundo plano con .NET CORE Lifetime e inyección de DI.

Quiero utilizar tareas en segundo plano en ASP.NET Core.
Encontré documentación útil en https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&tabs=visual-studio

Me pregunto por qué su tiempo de vida aparentemente es scoped: Servicio alojado que activa un servicio en ámbito. El servicio en ámbito puede usar la inyección de dependencias (DI).
¿Qué significa el ámbito en este contexto?

Para aplicaciones web, un ámbito de duración indica que los servicios se crean una vez por solicitud de cliente (conexión). Registre los servicios con alcance mediante AddScoped.
En las aplicaciones que procesan solicitudes, los servicios en ámbito se eliminan al final de la solicitud.

Si bien entiendo lo que esto significa para, por ejemplo, una solicitud estándar HTTP GET a una API,
no entiendo el significado de ser un trabajador en segundo plano.
En mi opinión, tendría más sentido tener un trabajador en segundo plano singleton. Ciertamente, no quiero tener varias instancias funcionando al mismo tiempo en mi aplicación.

Otra cosa es la inyección de dependencias en los trabajadores en segundo plano que aparentemente difiere de los servicios estándar:
Para utilizar servicios en ámbito dentro de un BackgroundService, cree un ámbito. De forma predeterminada, no se crea ningún ámbito para un servicio alojado.

No puedo confirmarlo:

services.AddHostedService(x =&gt; new DataPersister(x.GetRequiredService&lt;IAsyncDocumentSession&gt;(), x.GetRequiredService<ILogger>()));

parece funcionar muy bien.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como especialista en TI especializado en asp.net-core, ha encontrado documentación útil sobre cómo utilizar tareas en segundo plano en asp.net core desde el sitio web oficial de Microsoft. Sin embargo, tiene algunas preocupaciones con respecto a la duración de estas tareas, particularmente el hecho de que aparentemente están acotadas. Para comprender el significado de “alcance” en este contexto, debe saber que un tiempo de vida acotado en aplicaciones web indica que los servicios se crean una vez por solicitud del cliente (conexión). Esto significa que los servicios se eliminan al final de la solicitud en aplicaciones que procesan solicitudes.

    En cuanto a los trabajadores en segundo plano, no comprende completamente el significado de estar acotados, ya que tendría más sentido tener un trabajador en segundo plano singleton. Definitivamente no desea tener varias instancias ejecutándose al mismo tiempo en su aplicación. Sin embargo, vale la pena señalar que los servicios acotados son relevantes en el contexto de un trabajador en segundo plano que persiste durante un período prolongado. Dado que un servicio acotado se crea una vez por solicitud del cliente y se elimina al final de la solicitud, utilizarlo en un servicio en segundo plano que se ejecuta continuamente crearía una nueva instancia del servicio para cada solicitud, lo que llevaría a un consumo excesivo de recursos.

    Otra cosa que ha notado es que DI en los trabajadores en segundo plano aparentemente es diferente de los servicios estándar. Según la documentación, debe crear un alcance para utilizar servicios acotados dentro de un BackgroundService, ya que no se crea automáticamente un alcance para un servicio hospedado. Sin embargo, ha descubierto que el método services.AddHostedService() que toma una expresión lambda funciona bien sin crear un nuevo alcance. Esto se debe a que la expresión lambda crea automáticamente un alcance, lo que le permite utilizar servicios acotados sin crear explícitamente un alcance.

    En conclusión, mientras que los servicios acotados pueden parecer contraintuitivos para utilizar en un trabajador en segundo plano que se ejecuta continuamente, es esencial comprender que se crean una vez por solicitud y se eliminan al final de la solicitud. Además, si bien la documentación indica que debe crear un nuevo alcance para utilizar servicios acotados en un BackgroundService, puede utilizar una expresión lambda para crear automáticamente un alcance, simplificando el proceso de utilizar servicios acotados.

Comments are closed.