net iservicecollection inyeccion injection dependency dependencias asp dependency-injection .net-core service-provider

dependency injection - iservicecollection - ¿Cómo obtener una instancia de IServiceProvider en.NET Core?



inyeccion de dependencias.net core (2)

Como Goaty mencionó, es suficiente crear una nueva ServiceCollection . Aquí hay una clase de ejemplo que se puede usar para acceder al contenedor DI en .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 clase de Startup se toma de un proyecto probado, por lo que no es necesario repetir los registros del servicio.

Luego, en la clase de prueba, simplemente use:

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

IServiceProvider es una interfaz con un solo método:

object GetService(Type serviceType);

Se utiliza para crear instancias de tipos registrados en .NET Core DI nativo contenedor.

Una instancia de IServiceProvider se puede obtener llamando a un método BuildServiceProvider de un IServiceCollection . IServiceCollection es un parámetro del método ConfigureServices en una clase de Startup . Parece ser llamado mágicamente con una instancia de IServiceCollection por el marco.

Quiero crear una instancia de IServiceProvider sin tener ningún método de Setup . Lo necesito para resolver dependencias en un ensamblaje de prueba de integración. ¿Es posible conseguirlo en este escenario?