2017-02-14 14 views
2

IServiceProvider представляет собой интерфейс с одним методом:Как получить экземпляр IServiceProvider в .NET Core?

object GetService(Type serviceType); 

Он используется для создания экземпляров типов, зарегистрированных в .NET Основной родной DI контейнер.

Экземпляр IServiceProvider сам по себе может быть получен путем вызова метода BuildServiceProvider для IServiceCollection. IServiceCollection - параметр ConfigureServices в классе Startup. Кажется, что магически вызвано с помощью рамки IServiceCollection.

Я хочу создать экземпляр IServiceProvider без использования метода Setup. Мне нужно, чтобы он разрешал зависимости в сборке тестов интеграции. Можно ли вообще получить этот сценарий?

ответ

3

Это реализация по умолчанию IServiceCollection от Microsoft: https://github.com/aspnet/DependencyInjection/blob/dev/src/Microsoft.Extensions.DependencyInjection/ServiceCollection.cs

Глядя на код, то вы должны быть в состоянии получить IServiceCollection просто позвонив по телефону:

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

Надежда, что помогает :)

10

Как goaty упомянул, что этого достаточно, чтобы создать новый ServiceCollection. Вот пример класса, который может быть использован для DI контейнера доступа в .NET Ядра:

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 класс взят из тестируемой проекта поэтому регистраций услуг не должны повторяться.

Тогда в тестовом классе просто использовать:

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