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.

¿Es posible incluir un argumento en IServiceScopeFactory.ServiceProvider.GetRequiredService()?

Digamos que tengo el siguiente código en la clase “HostedService” utilizando IServiceScopeFactory para ejecutar un scope y crear la instancia de la clase de servicio (como se explica aquí -> https://stackoverflow.com/questions/48368634/how-should-i-inject-a-dbcontext-instance-into-an-ihostedservice/48368934#48368934):

usando (var scope = ScopeFactory.CreateScope())
{
var provisioningService = scope.ServiceProvider.GetRequiredService();
}

Entonces, me gustaría hacer algo similar a lo siguiente para incluir un parámetro dentro de la creación de la instancia de servicio:

servicios.AddSingleton(x => new UserCarrierService(user));

pero esto se realiza usando la clase IServiceScopeFactory. Si no, ¿es posible anular en absoluto el DI construido en la clase Startup en una etapa posterior de la ejecución del programa de .net core?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para incluir un parámetro dentro de la creación del servicio de instancia utilizando la clase IServiceScopeFactory, puede modificar el código de la siguiente manera:

    C#
    using (var scope = ScopeFactory.CreateScope())
    {
    var userCarrierService = activatorUtilities.CreateInstance<usercarrierservice>(scope.ServiceProvider, user);
    }

    Aquí, puede utilizar la clase ActivatorUtilities para crear una instancia de la clase UserCarrierService y pasar el parámetro user a su constructor. La instancia IServiceProvider de IServiceScopeFactory se utiliza para resolver cualquier dependencia requerida por el constructor.

    También es posible anular la DI construida en la clase Startup en una etapa posterior de la ejecución del programa .NET Core. Una forma de hacerlo es utilizar una vida útil diferente (por ejemplo, Transient o Scoped) para el registro del servicio en una etapa posterior del programa, lo que creará una nueva instancia del servicio con el nuevo registro. Otra forma es utilizar una clave de registro diferente (por ejemplo, un registro con nombre) para el servicio en una etapa posterior, lo que le permitirá registrar varias instancias del mismo servicio con diferentes tiempos de vida o parámetros.

Comments are closed.