2017-02-14 3917 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)); 
相關問題