webentwicklung-frage-antwort-db.com.de

Wie erhalte ich eine Instanz von IServiceProvider in .NET Core?

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?

34
Landeeyo

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 :)

18
user3151814

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));
38
Landeeyo