Saltar al contenido

¿Cómo obtener una instancia de IServiceProvider en .NET Core?

Este equipo de especialistas luego de varios días de investigación y recopilación de de datos, obtuvieron la respuesta, queremos que te sea útil para tu proyecto.

Solución:

Como caprino mencionó que es suficiente para crear nuevos ServiceCollection. Aquí hay una clase de ejemplo que se puede usar para acceder al contenedor DI en .NET Core:

public static class ServiceProviderFactory

    public static IServiceProvider ServiceProvider  get; 

    static ServiceProviderFactory()
    
        HostingEnvironment env = new HostingEnvironment();
        env.ContentRootPath = Directory.GetCurrentDirectory();
        env.EnvironmentName = "Development";

        Startup startup = new Startup(env);
        ServiceCollection sc = new ServiceCollection();
        startup.ConfigureServices(sc);
        ServiceProvider = sc.BuildServiceProvider();
    

Startup la clase se toma del proyecto probado, por lo que no es necesario repetir los registros del servicio.

Luego, en la clase de prueba, simplemente use:

var foo = ServiceProviderFactory.ServiceProvider.GetServices(typeof(IFoo));

Esta es la implementación predeterminada de IServiceCollection de Microsoft: https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs

Mirando el código, entonces debería poder obtener un IServiceCollection simplemente llamando:

var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();

Espero que ayude 🙂

Para obtener acceso a la DI existente de la aplicación ASP.NET Core, por ejemplo, en algún controlador, debe registrarlo en el método ConfigureServices de Startup.cs:

public IServiceProvider ConfigureServices(IServiceCollection services)

   services.AddMvc();
   services.AddSingleton(services);   //  <- here

   // ... other DI registrations
   services.AddSingleton();
   services.AddTransient();

Después de eso, puede usarlo en cualquier objeto resuelto de DI como este:

public class FooManager: IFooManager

    private readonly ServiceProvider _di;

    public FooManager(IServiceCollection serviceCollection)
    
        _di = serviceCollection.BuildServiceProvider();
    

    public void Start()
    
        var w1 = _di.GetRequiredService();  // new instance of FooWorker
        var w2 = _di.GetRequiredService();  // new instance of FooWorker
    

Eres capaz de reafirmar nuestra publicación ejecutando un comentario y dejando una puntuación te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *