Este equipo de especialistas luego de varios días de investigación y recopilación de de datos, obtuvieron la respuesta, queremos que te sea útil para tu proyecto.
Solución:
Como caprino mencionó que es suficiente para crear nuevos 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
la clase se toma del 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));
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:
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
Espero que ayude 🙂
Para obtener acceso a la DI existente de la aplicación ASP.NET Core, por ejemplo, en algún controlador, debe registrarlo en el método ConfigureServices de Startup.cs:
public IServiceProvider ConfigureServices(IServiceCollection services)
services.AddMvc();
services.AddSingleton(services); // <- here
// ... other DI registrations
services.AddSingleton();
services.AddTransient();
Después de eso, puede usarlo en cualquier objeto resuelto de DI como este:
public class FooManager: IFooManager
private readonly ServiceProvider _di;
public FooManager(IServiceCollection serviceCollection)
_di = serviceCollection.BuildServiceProvider();
public void Start()
var w1 = _di.GetRequiredService(); // new instance of FooWorker
var w2 = _di.GetRequiredService(); // new instance of FooWorker
Eres capaz de reafirmar nuestra publicación ejecutando un comentario y dejando una puntuación te estamos agradecidos.