2017-02-14 3913 views
2

IServiceProvider与单个方法的接口:如何在.NET Core中获取IServiceProvider的实例?

object GetService(Type serviceType); 

它用于创建在.NET核心天然DI容器中注册类型的实例。

IServiceProvider本身的实例可以通过调用IServiceCollectionBuildServiceProvider方法获得。 IServiceCollectionStartup类中的ConfigureServices方法的参数。这个框架似乎被神奇地称为IServiceCollection的实例。

我想创建一个IServiceProvider的实例,根本没有Setup方法。我需要它来解决集成测试程序集中的依赖关系。在这种情况下可以得到它吗?

回答

10

As goaty提到它足以创建新的ServiceCollection。这里的示例类可用于访问DI容器在.NET核心:

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)); 
相关问题