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?
Esta es la implementación predeterminada de IServiceCollection
de Microsoft: https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs
Mirando el código, entonces debería poder obtener un IServiceCollection
simplemente llamando a:
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
Espero que ayude :)