Как получить экземпляр 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));