2017-02-14 6 views
2

IServiceProvider ist eine Schnittstelle mit Single-Methode:Wie bekomme ich eine Instanz von IServiceProvider in .NET Core?

object GetService(Type serviceType); 

Er wird verwendet in .NET Core-nativen DI-Container registriert Instanzen von Typen zu erstellen.

Eine Instanz von IServiceProvider selbst kann durch Aufruf einer BuildServiceProvider Methode einer IServiceCollection erhalten werden. IServiceCollection ist ein Parameter der ConfigureServices Methode in einer Startup Klasse. Es scheint magisch mit einer Instanz von IServiceCollection durch das Framework aufgerufen zu werden.

Ich möchte eine Instanz von IServiceProvider ohne Setup Methode überhaupt erstellen. Ich brauche es, um Abhängigkeiten in einer Integrationstest-Assembly aufzulösen. Ist es in diesem Szenario überhaupt möglich, es zu bekommen?

Antwort

10

Als goaty erwähnt, es ist genug, um neue ServiceCollection zu erstellen. Hier ist beispielsweise Klasse, die den Zugriff auf DI-Container in .NET-Core verwendet werden können:

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 Klasse von geprüften Projekt genommen wird, um die Service-Registrierungen nicht wiederholt werden müssen.

Dann einfach in Testklasse verwenden:

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