web-dev-qa-db-fra.com

Comment obtenir une instance d'IServiceProvider dans .NET Core?

IServiceProvider est une interface avec une seule méthode:

object GetService(Type serviceType);

Il est utilisé pour créer des instances de types enregistrés dans le conteneur DI natif .NET Core.

Une instance de IServiceProvider elle-même peut être obtenue en appelant une méthode BuildServiceProvider d'un IServiceCollection. IServiceCollection est un paramètre de la méthode ConfigureServices dans une classe Startup. Il semble être appelé comme par magie avec une instance de IServiceCollection par le framework.

Je veux créer une instance de IServiceProvider sans avoir la méthode Setup. J'en ai besoin pour résoudre les dépendances dans un assemblage de test d'intégration. Est-il possible de l'obtenir du tout dans ce scénario?

34
Landeeyo

Ceci est l'implémentation par défaut de IServiceCollection de Microsoft: https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs

En regardant le code, vous devriez pouvoir obtenir un IServiceCollection simplement en appelant:

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

J'espère que ça t'as aidé :)

18
user3151814

Comme goaty mentionné, il suffit de créer un nouveau ServiceCollection. Voici un exemple de classe pouvant être utilisée pour accéder au conteneur DI dans .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();
    }
}

La classe Startup provient d'un projet testé, il n'est donc pas nécessaire de répéter les enregistrements de service.

Ensuite, dans la classe de test, utilisez simplement:

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