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?
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é :)
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));