IServiceProvider
ist eine Schnittstelle mit einer einzigen Methode:
object GetService(Type serviceType);
Es wird verwendet, um Instanzen von Typen zu erstellen, die im nativen DI-Container von .NET Core registriert sind.
Eine Instanz von IServiceProvider
selbst kann durch Aufrufen einer BuildServiceProvider
-Methode eines IServiceCollection
abgerufen werden. IServiceCollection
ist ein Parameter der Methode ConfigureServices
in einer Klasse Startup
. Es scheint magisch mit einer Instanz von IServiceCollection
vom Framework aufgerufen zu werden.
Ich möchte eine Instanz von IServiceProvider
erstellen, ohne überhaupt die Methode Setup
zu haben. Ich brauche es, um Abhängigkeiten in einer Integrationstest-Assembly aufzulösen. Ist es in diesem Szenario überhaupt möglich, es zu bekommen?
Dies ist die Standardimplementierung von IServiceCollection
von Microsoft: https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs
Wenn Sie sich den Code ansehen, sollten Sie in der Lage sein, einen IServiceCollection
zu erhalten, indem Sie einfach anrufen:
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
Hoffentlich hilft das :)
Wie goaty erwähnt, reicht es aus, ein neues ServiceCollection
zu erstellen. Hier ist eine Beispielklasse, mit der auf den DI-Container in .NET Core zugegriffen werden kann:
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();
}
}
Die Klasse Startup
stammt aus einem getesteten Projekt, sodass die Serviceregistrierungen nicht wiederholt werden müssen.
Dann benutze im Test einfach:
var foo = ServiceProviderFactory.ServiceProvider.GetServices(typeof(IFoo));