Как получить экземпляр IServiceProvider in.NET ядро?

IServiceProvider - это интерфейс с одним методом:

object GetService(Type serviceType);

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

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

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

2 ответов


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

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

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

надеюсь, что это поможет:)


As козлиная упомянуто, что достаточно создать новый ServiceCollection. Вот пример класса, который можно использовать для доступа к контейнеру DI в .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();
    }
}

Startup класс берется из тестируемого проекта, поэтому регистрации службы не нужно повторять.

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

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